geobretagne / mdchecker

This is a simple quality assurance tool performing unit tests on a CSW-enabled catalog.
GNU General Public License v3.0
2 stars 2 forks source link

Utilisation de esn='brief' avec getrecords2 de owslib/csw #3

Closed bchartier closed 8 years ago

bchartier commented 8 years ago

Je fais des tests du catalogue de GéoPicardie avec mdchecker (http://www.geopicardie.fr/geonetwork/srv/fre/csw). Je rencontre une erreur sur certaines fiches de métadonnées qui fait planter mdchecker :

Traceback (most recent call last):
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker_geopic/venv/lib/python2.7/site-packages/flask/app.py", line 1988, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker_geopic/venv/lib/python2.7/site-packages/flask/app.py", line 1641, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker_geopic/venv/lib/python2.7/site-packages/flask/app.py", line 1544, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker_geopic/venv/lib/python2.7/site-packages/flask/app.py", line 1639, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker_geopic/venv/lib/python2.7/site-packages/flask/app.py", line 1625, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker_geopic/mdchecker/main.py", line 243, in index
    metadatas, count, score = runTests(args, mdUnitTests)
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker_geopic/mdchecker/main.py", line 151, in runTests
    count = inspirobot.mdcount(cfg['cswurl'], constraints=constraints, startrecord=args['nextrecord'], maxharvest=args['maxharvest'])
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker_geopic/mdchecker/inspirobot/Inspirobot.py", line 208, in mdcount
    csw.getrecords2(esn='brief', constraints=constraints, startposition=startrecord, maxrecords=maxharvest)
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker_geopic/venv/lib/python2.7/site-packages/owslib/csw.py", line 391, in getrecords2
    self._parserecords(outputschema, esn)
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker_geopic/venv/lib/python2.7/site-packages/owslib/csw.py", line 561, in _parserecords
    self.records[identifier] = CswRecord(i)
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker_geopic/venv/lib/python2.7/site-packages/owslib/csw.py", line 817, in __init__
    self.bbox = ows.BoundingBox(val, namespaces['ows'])
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker_geopic/venv/lib/python2.7/site-packages/owslib/ows.py", line 202, in __init__
    self.crs = crs.Crs(val)
  File "/Users/benji/dev/projects_current/mdchecker/mdchecker_geopic/venv/lib/python2.7/site-packages/owslib/crs.py", line 1754, in __init__
    self.code = int(vals[-1])
ValueError: invalid literal for int() with base 10: '2154::'

Les exceptions renvoyées par owslib n'identifient pas la fiche de métadonnées impliquée. Avant de pouvoir corriger l'anomalie du côté des fiches de métadonnées, je cherche à rendre plus robuste mdchecker à ce genre d'anomalies.

En regardant le code impliqué de mdchecker (cf. https://github.com/geobretagne/mdchecker/blob/master/mdchecker/inspirobot/Inspirobot.py#L205-L209), je me dis que l'utilisation de esn='brief' est peut-être inutile. J'ai réalisé un test sans ce paramètre et cela semble fonctionner parfaitement avec le catalogue de GéoPicardie. Quand des métadonnées correctes sont parsées les résultats des tests semblent identiques. J'ai l'impression que l'appel à getrecords2 n'est utilisé que pour dénombrer les fiches. Le fait de supprimer ce paramètre ou de le remplacer par esn="summary" me parait donc plus judicieux.

genre : csw.getrecords2(constraints=constraints, startposition=startrecord, maxrecords=maxharvest)

Est-ce que mon analyse est correcte ? Est-ce qu'il est raisonnable que j'intègre cette modification dans l'évolution que je prépare ?

fphg commented 8 years ago

Merci pour la review brief a été utilisé pour réduire le trafic mais autant utiliser quelque chose de + fiable. owslib n'implémente pas toutes les subtilités des normes, il faut donc rester mainstream. OK donc

bchartier commented 8 years ago

Ok, j'ai relu la spec CSW 2.0.2 avec l'approche "compacité" que tu évoques. summary est effectivement plus verbeux que brief Je propose donc la solution suivante (qui fonctionne aussi après un rapide test) : csw.getrecords2(esn='brief', constraints=constraints, startposition=startrecord, maxrecords=maxharvest, resulttype='hits')

C'est ce qu'il y a de plus compact et de plus adapté au besoin : le comptage d'enregistrements.

fphg commented 8 years ago

Le 02/08/2016 15:29, Benjamin C. a écrit :

Ok, j'ai relu la spec CSW 2.0.2 avec l'approche "compacité" que tu évoques. summary est effectivement plus verbeux que brief Je propose donc la solution suivante (qui fonctionne aussi après un rapide test) :

C'est ce qu'il y a de plus compact et de plus adapté au besoin : le comptage d'enregistrements.

Oui parfait !

Fabrice Phung