Giter VIP home page Giter VIP logo

pywcmp's Introduction

pywcmp

Build Status

WMO Core Metadata Profile Test Suite

pywcmp provides validation and quality assessment capabilities for the WMO WIS Core Metadata Profile (WCMP).

Installation

pip

Install latest stable version from PyPI.

pip3 install pywcmp

From source

Install latest development version.

python3 -m venv pywcmp
cd pywcmp
. bin/activate
git clone https://github.com/wmo-im/pywcmp.git
cd pywcmp
pip3 install -r requirements.txt
python3 setup.py install

Running

From command line:

# fetch version
pywcmp --version

# sync supporting configuration bundle (schemas, topics, etc.)
pywcmp bundle sync

# abstract test suite

# validate WCMP2 metadata against abstract test suite (file on disk)
pywcmp ets validate /path/to/file.json

# validate WCMP2 metadata against abstract test suite (URL)
pywcmp ets validate https://example.org/path/to/file.json

# validate WCMP2 metadata against abstract test suite (URL), but turn JSON Schema validation off
pywcmp ets validate https://example.org/path/to/file.json --no-fail-on-schema-validation

# adjust debugging messages (CRITICAL, ERROR, WARNING, INFO, DEBUG) to stdout
pywcmp ets validate https://example.org/path/to/file.json --verbosity DEBUG

# write results to logfile
pywcmp ets validate https://example.org/path/to/file.json --verbosity DEBUG --logfile /tmp/foo.txt

# key performance indicators

# all key performance indicators at once
pywcmp kpi validate https://example.org/path/to/file.json --verbosity DEBUG

# all key performance indicators at once, but turn ETS validation off
pywcmp kpi validate https://example.org/path/to/file.json --no-fail-on-ets --verbosity DEBUG

# all key performance indicators at once, in summary
pywcmp kpi validate https://example.org/path/to/file.json --verbosity DEBUG --summary

# selected key performance indicator
pywcmp kpi validate --kpi title /path/to/file.json -v INFO

Using the API

>>> # test a file on disk
>>> import json
>>> from pywcmp.wcmp2.ets import WMOCoreMetadataProfileTestSuite2
>>> with open('/path/to/file.json') as fh:
...     data = json.load(fh)
>>> # test ETS
>>> ts = WMOCoreMetadataProfileTestSuite2(datal)
>>> ts.run_tests()  # raises ValueError error stack on exception
>>> # test a URL
>>> from urllib2 import urlopen
>>> from StringIO import StringIO
>>> content = StringIO(urlopen('https://....').read())
>>> data = json.loads(content)
>>> ts = WMOCoreMetadataProfileTestSuite2(data)
>>> ts.run_tests()  # raises ValueError error stack on exception
>>> # handle pywcmp.errors.TestSuiteError
>>> # pywcmp.errors.TestSuiteError.errors is a list of errors
>>> try:
...    ts.run_tests()
... except pywcmp.errors.TestSuiteError as err:
...    print('\n'.join(err.errors))
>>> ...
>>> # test KPI
>>> from pywcmp.kpi import WMOCoreMetadataProfileKeyPerformanceIndicators
>>> kpis = WMOCoreMetadataProfileKeyPerformanceIndicators(data)
>>> results = kpis.evaluate()
>>> results['summary']

Development

python3 -m venv pywcmp
cd pywcmp
source bin/activate
git clone https://github.com/wmo-im/pywcmp.git
pip3 install -r requirements.txt
pip3 install -r requirements-dev.txt
python3 setup.py install

Running tests

# via setuptools
python3 setup.py test
# manually
python3 tests/run_tests.py

Releasing

# create release (x.y.z is the release version)
vi pywcmp/__init__.py  # update __version__
git commit -am 'update release version x.y.z'
git push origin master
git tag -a x.y.z -m 'tagging release version x.y.z'
git push --tags

# upload to PyPI
rm -fr build dist *.egg-info
python3 setup.py sdist bdist_wheel --universal
twine upload dist/*

# publish release on GitHub (https://github.com/wmo-im/pywcmp/releases/new)

# bump version back to dev
vi pywcmp/__init__.py  # update __version__
git commit -am 'back to dev'
git push origin master

Code Conventions

PEP8

Issues

Issues are managed at https://github.com/wmo-im/pywcmp/issues

Contact

pywcmp's People

Contributors

antje-s avatar josusky avatar tomkralidis avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pywcmp's Issues

add wcmp2 validation

Add the ability for pywcmp to validate a WCMP2 document. Example:

pywcmp ats validate --file /path/to/file.json

Note that we'll need to have a generic detection mechanism across pywcmp that will route the workflow to WCMP1 or WCMP2 accordingly (e.g. if JSON, then WCMP2, else WCMP1).

Note that setup will need to be updated to download the WCMP2 schemas.

AttributeError: '_io.BufferedReader' object has no attribute 'status'

When running pywcmp's "evaluate()" over a sample of sets it sometimes crashes on AttributeError: '_io.BufferedReader' object has no attribute 'status'

[2022-03-01, 07:44:17 UTC] {update_wis_metadata_analysis.py:200} INFO - (68886) Evaluating metadata-file=urn_x-wmo_md_int.wmo.wis__HJWM88EGRR.xml: 
[2022-03-01, 07:44:20 UTC] {update_wis_metadata_analysis.py:200} INFO - (68887) Evaluating metadata-file=urn_x-wmo_md_int.wmo.wis__HJWO88EGRR.xml: 
[2022-03-01, 07:44:22 UTC] {update_wis_metadata_analysis.py:200} INFO - (68888) Evaluating metadata-file=urn_x-wmo_md_int.wmo.wis__HJXA88ECMF.xml: 
[2022-03-01, 07:44:28 UTC] {taskinstance.py:1703} ERROR - Task failed with exception
Traceback (most recent call last):
  File "/home/airflow/.local/lib/python3.7/site-packages/airflow/models/taskinstance.py", line 1332, in _run_raw_task
    self._execute_task_with_callbacks(context)
  File "/home/airflow/.local/lib/python3.7/site-packages/airflow/models/taskinstance.py", line 1458, in _execute_task_with_callbacks
    result = self._execute_task(context, self.task)
  File "/home/airflow/.local/lib/python3.7/site-packages/airflow/models/taskinstance.py", line 1514, in _execute_task
    result = execute_callable(context=context)
  File "/home/airflow/.local/lib/python3.7/site-packages/airflow/decorators/base.py", line 134, in execute
    return_value = super().execute(context)
  File "/home/airflow/.local/lib/python3.7/site-packages/airflow/operators/python.py", line 151, in execute
    return_value = self.execute_callable()
  File "/home/airflow/.local/lib/python3.7/site-packages/airflow/operators/python.py", line 162, in execute_callable
    return self.python_callable(*self.op_args, **self.op_kwargs)
  File "/opt/airflow/dags/update_wis_metadata_analysis.py", line 203, in update_wis_metadata_kpi
    results = kpis.evaluate()
  File "/home/airflow/.local/lib/python3.7/site-packages/pywcmp/kpi.py", line 976, in evaluate
    result = getattr(self, kpi)()
  File "/home/airflow/.local/lib/python3.7/site-packages/pywcmp/kpi.py", line 593, in kpi_008
    result = check_url(link, False)
  File "/home/airflow/.local/lib/python3.7/site-packages/pywcmp/util.py", line 320, in check_url
    if response.status > 300:
  File "/usr/local/lib/python3.7/tempfile.py", line 476, in __getattr__
    a = getattr(file, name)
  File "/usr/local/lib/python3.7/tempfile.py", line 476, in __getattr__
    a = getattr(file, name)
AttributeError: '_io.BufferedReader' object has no attribute 'status'
[2022-03-01, 07:44:28 UTC] {taskinstance.py:1280} INFO - Marking task as FAILED. dag_id=update_wis_metadata, task_id=update_wis_metdata_kpi_chunk11, execution_date=20220202T000000, start_date=20220301T074254, end_date=20220301T074428
[2022-03-01, 07:44:28 UTC] {standard_task_runner.py:91} ERROR - Failed to execute job 1898 for task update_wis_metdata_kpi_chunk11

KPI: increase error robustness of KPI checks

Dear pywmcp team,

the KPI checks are running fine. I just noticed that in case of problems with single KPI check the script aborts completely. It would be good to jump to the next KPI check in case of problems, so that all KPI checks are tried for each metadata record.

Examples:

  1. Links check failed:
    urn%3Ax-wmo%3Amd%3Aint.wmo.wis%3A%3ACSCZ10OKPR.xml
    -->
    [2021-05-31T06:38:56Z] INFO - Running KPI-8: Links health
    [2021-05-31T06:38:56Z] INFO - "http://wis.wmo.int/2012/codelists/WMOCodeLists.xml#WMO_GTSProductCategoryCode" cannot be resolved!
    --> not checked KPI-9 / KPI-10 / KPI-11 / KPI-12

  2. undefined namespace prefix
    urn%3Ax-wmo%3Amd%3Aint.eumetsat%3AEO%3AEUM%3ADAT%3ASENTINEL-3%3ASR_1_SRA_A___NTC.xml
    -->
    [2021-05-31T07:21:37Z] INFO - Running KPI-7: Graphic overview for non bulletins metadata records
    --> not checked KPI-8 / KPI-9 / KPI-10 / KPI-11 / KPI-12
    call via command line for single xml returned:
    ...
    File "...python3.6/site-packages/pywcmp-0.3.dev0-py3.6.egg/pywcmp/kpi.py", line 962, in evaluate
    result = getattr(self, kpi)()
    File "...python3.6/site-packages/pywcmp-0.3.dev0-py3.6.egg/pywcmp/kpi.py", line 531, in kpi_007
    graphic_overviews = self.exml.xpath(xpath, namespaces=self.namespaces)
    File "src/lxml/etree.pyx", line 2296, in lxml.etree._ElementTree.xpath
    File "src/lxml/xpath.pxi", line 357, in lxml.etree.XPathDocumentEvaluator.call
    File "src/lxml/xpath.pxi", line 225, in lxml.etree._XPathEvaluatorBase._handle_result
    lxml.etree.XPathEvalError: Undefined namespace prefix

Kind regards
Antje

Limit testing of title and abstract to first instance

Per the ISO standard, it's possible to have repeating identification sections and there is nothing in the WCMP guidance that specifically limits gmd:identificationInfo to one. Therefore, please change pywcmp to only test the first instance of title and abstract and ignore the rest. At this point, we are not changing the KPIs. 

wmo-im/wcmp#125

KPI-5 returns score 0 for everything

I recommend that we change the pywcmp for KPI-5 to only test when DOI's exist.
This will be consistent with the approach we are taking with KPI-7 (graphic overview). Given that this is a relatively recent practice in metadata management, giving a score of 0 is quite harsh. What do you think?

image

'NoneType' object has no attribute 'split'

Running over the metadata-file: urn_x-wmo_md_int.wmo.wis__MAXE98RUMS.xml, produces the following error:

/usr/local/lib/python3.7/site-packages/pywcmp-0.4.dev0-py3.7.egg/pywcmp/kpi.py in kpi_002(self)
    212 
    213             LOGGER.debug('Testing number of words')
--> 214             title_words = title.split()
    215             if len(title_words) >= 3:
    216                 score += 1

AttributeError: 'NoneType' object has no attribute 'split'

Code list files are missing

External files referenced from util.py are missing:

pywcmp/pywcmp/util.py

Lines 98 to 101 in 4cd02de

codelist_files = {
'iso': f'{userdir}/schema/resources/Codelist/gmxCodelists.xml',
'wmo': f'{userdir}{os.sep}WMOCodeLists.xml'
}

xsd = os.path.join(userdir, 'iso-all.xsd')

One of these is available from https://wis.wmo.int/2012/codelists/WMOCodeLists.xml but it is unclear where to get the others from. Without these pywcmp returns an error message, e.g.

root@8448d2a2f6aa:/data# pywcmp ats validate --file ./urn_x-wmo_md_int.wmo.wis__HHUL85LFPW.xml
Validating file /data/urn_x-wmo_md_int.wmo.wis__HHUL85LFPW.xml
OTHER ERROR: Error reading file '/root/.pywcmp/iso-all.xsd': failed to load external entity "/root/.pywcmp/iso-all.xsd"

The bundle tool does not honor verbosity settings

I have got a lot of WARNINGs about non-existent *.csv files and when I tried to increase verbosity to see where the problem comes from I realized that the --verbosity is not honoured in this tool.

add line numbers to KPI report comments

Running KPI validation returns a report with each KPI providing comments with error descriptions. Foreach comment, add the given line number where the error occurred to help GISCs and metadata providers pinpoint/analyze where the issues exist.

To be implemented as a full pass, once we have the first pass of all KPIs implemented.

Tests for global data exchange

Should test 9_2_1 or 9_3_1 be run if the data are not marked for global exchange?

pywcmp/pywcmp/ats.py

Lines 110 to 115 in 3025959

def run_tests(self):
"""Convenience function to run all tests"""
tests = ['6_1_1', '6_1_2', '6_2_1', '6_3_1', '8_1_1',
'8_2_1', '8_2_2', '8_2_3', '8_2_4', '9_1_1',
'9_2_1', '9_3_1', '9_3_2']

If the data are not marked for global exchange then the rules for the gmd:fileIdentifier are different / more relaxed. Page 50, section 8.1 of the manual on WIS (https://library.wmo.int/doc_num.php?explnum_id=11077), my emphasis.

The WMO Core Metadata Profile recommends the use of a URI structure for gmd:fileIdentifier
attributes. The URI should be structured as follows:
• Fixed string “urn:x-wmo:md:”;
Citation authority based on the Internet domain name of the data-provider organization,
e.g. “int.wmo.wis”, “gov.noaa”, “edu.ucar.ncar”, “cn.gov.cma” or “uk.gov.metoffice”;

• Double separator colons: “::”;
• Unique identifier:
– For metadata records describing GTS products in bulletins or named according to
the WMO file-naming convention P-flag = “T” or P-flag= “A”, the unique identifier is
“«TTAAii»«CCCC»”;
– For metadata records describing products named according to the WMO file-naming
convention P-flag = “W”, the unique identifier should be a truncated version of the
WMO product identifier field of the associated data-files, excluding the date-stamp
and any other varying elements as necessary;

KPI-1 should total 13

KPI-1 is defined with a total score of 13 (one foreach ATS requirement). Current implementation in pywcmp provides a score of 0 or 1 (1 if all 13 ATS requirements are passed).

Update KPI-7

Testing for gmx:Anchor is too restrictive and during the last cycle of KPI testing all records received a 0 on KPI-7.  

I think we should simplify the XPath for tests 7.1 and 7.2, but then add a 3rd test for gmx:Anchor and change the total score to 3. This is consistent with other KPIs like keywords and data policy. @tomkralidis --OK? 

Change  //gmd:identificationInfo/gmd:MD_DataIdentification/gmd:graphicOverview/gmd:MD_BrowseGraphic/gmd:fileName/gmx:Anchor

//gmd:identificationInfo/gmd:MD_DataIdentification/gmd:graphicOverview/gmd:MD_BrowseGraphic/gmd:fileName

See previous discussions in issue wmo-im/wcmp#124.

KPI-2 and KPI-3 spellchecking

Both KPI-2 and KPI-3 provide a point for passing a basic spellcheck.

pywcmp uses spellchecker to perform a basic spellchecker. In both KPI-2 and KPI-3 implementations, we send the title or abtract to pyspellchecker per below (spellcheck passes are empty sets).

>>> from spellchecker import SpellChecker
>>> s = SpellChecker()
>>> s.unknown('this is a test'.split())
set()
>>> s.unknown('this is a test (hi)'.split())
{'(hi)'}
>>> s.unknown('this is a test hi.'.split())
{'hi.'}
>>> s.unknown('this is a sentence. This is another sentence.'.split())
{'sentence.'}

As we can see, words in brackets, or normal sentences (end words with periods) result in false positives.

We need to update the spellchecking strategy and then apply by refacting both KPI-2 and KPI-3 spellchecking into a single function for reuse and consistency.

implement WCMP KPIs

Merge KPI-5 into KPI-9

The KPI-5 has only one test. As this test is somewhat related to WMO data policies, in the KPI description for the WIS Guide it was merged with the KPI-9. Naturally, thepywcmp must follow.

fix KPI 9 errors

After merge of #42, pywcmp fails when trying to validate some Canada NWP records (test metadata record pasted below):

(wmo) (base) tkralidi@maui:~/Dev/wmo/msc-geomet-wis$ pywcmp kpi validate --file test-canada-nwp.xml 
Validating file /Users/tkralidi/Dev/wmo/msc-geomet-wis/test-canada-nwp.xml
Traceback (most recent call last):
  File "/Users/tkralidi/Dev/wmo/bin/pywcmp", line 11, in <module>
    load_entry_point('pywcmp==0.3.dev0', 'console_scripts', 'pywcmp')()
  File "/Users/tkralidi/Dev/wmo/lib/python3.7/site-packages/click/core.py", line 829, in __call__
    return self.main(*args, **kwargs)
  File "/Users/tkralidi/Dev/wmo/lib/python3.7/site-packages/click/core.py", line 782, in main
    rv = self.invoke(ctx)
  File "/Users/tkralidi/Dev/wmo/lib/python3.7/site-packages/click/core.py", line 1259, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/Users/tkralidi/Dev/wmo/lib/python3.7/site-packages/click/core.py", line 1259, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/Users/tkralidi/Dev/wmo/lib/python3.7/site-packages/click/core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/Users/tkralidi/Dev/wmo/lib/python3.7/site-packages/click/core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "/Users/tkralidi/Dev/wmo/lib/python3.7/site-packages/click/decorators.py", line 21, in new_func
    return f(get_current_context(), *args, **kwargs)
  File "/Users/tkralidi/Dev/wmo/lib/python3.7/site-packages/pywcmp-0.3.dev0-py3.7.egg/pywcmp/kpi.py", line 1066, in validate
    kpis_results = kpis.evaluate(kpi)
  File "/Users/tkralidi/Dev/wmo/lib/python3.7/site-packages/pywcmp-0.3.dev0-py3.7.egg/pywcmp/kpi.py", line 953, in evaluate
    result = getattr(self, kpi)()
  File "/Users/tkralidi/Dev/wmo/lib/python3.7/site-packages/pywcmp-0.3.dev0-py3.7.egg/pywcmp/kpi.py", line 683, in kpi_009
    thesaurus_name = get_string_or_anchor_value(thesauruses[0])[0]
IndexError: list index out of range
<?xml version="1.0" ?>
<gmd:MD_Metadata xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:gmx="http://www.isotc211.org/2005/gmx" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://wis.wmo.int/2011/schemata/iso19139_2007/schema/gmd/gmd.xsd http://www.isotc211.org/2005/gmx http://wis.wmo.int/2011/schemata/iso19139_2007/schema/gmx/gmx.xsd">
  <gmd:fileIdentifier>
    <gco:CharacterString>urn:x-wmo:md:int.wmo.wis::c041e79a-914a-5a4e-a485-9cbc506195df-GDPS.ETA_AD</gco:CharacterString>
  </gmd:fileIdentifier>
  <gmd:language>
    <gmd:LanguageCode codeList="http://www.loc.gov/standards/iso639-2/" codeListValue="en" codeSpace="ISO 639-2">en</gmd:LanguageCode>
  </gmd:language>
  <gmd:characterSet>
    <gmd:MD_CharacterSetCode codeList="http://wis.wmo.int/2011/schemata/iso19139_2007/schema/resources/Codelist/gmxCodelists.xml#MD_CharacterSetCode" codeListValue="utf8" codeSpace="ISOTC211/19115">utf8</gmd:MD_CharacterSetCode>
  </gmd:characterSet>
  <gmd:hierarchyLevel>
    <gmd:MD_ScopeCode codeList="http://wis.wmo.int/2011/schemata/iso19139_2007/schema/resources/Codelist/gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset" codeSpace="ISOTC211/19115">dataset</gmd:MD_ScopeCode>
  </gmd:hierarchyLevel>
  <gmd:contact>
    <gmd:CI_ResponsibleParty id="contact-pointOfContact">
      <gmd:individualName>
        <gco:CharacterString>National Inquiry Response Team / Équipe nationale de réponse des demandes du public</gco:CharacterString>
      </gmd:individualName>
      <gmd:organisationName xsi:type="gmd:PT_FreeText_PropertyType">
        <gco:CharacterString>Government of Canada; Environment and Climate Change Canada; Meteorological Service of Canada</gco:CharacterString>
        <gmd:PT_FreeText>
          <gmd:textGroup>
            <gmd:LocalisedCharacterString locale="#fr">Gouvernement du Canada; Environnement et Changement climatique Canada; Service météorologique du Canada</gmd:LocalisedCharacterString>
          </gmd:textGroup>
        </gmd:PT_FreeText>
      </gmd:organisationName>
      <gmd:positionName xsi:type="gmd:PT_FreeText_PropertyType">
        <gco:CharacterString>National Inquiry Response Team</gco:CharacterString>
        <gmd:PT_FreeText>
          <gmd:textGroup>
            <gmd:LocalisedCharacterString locale="#fr">Équipe nationale de réponse des demandes du public</gmd:LocalisedCharacterString>
          </gmd:textGroup>
        </gmd:PT_FreeText>
      </gmd:positionName>
      <gmd:contactInfo>
        <gmd:CI_Contact>
          <gmd:phone>
            <gmd:CI_Telephone>
              <gmd:voice>
                <gco:CharacterString>+01-819-997-2800</gco:CharacterString>
              </gmd:voice>
              <gmd:facsimile>
                <gco:CharacterString>+01-506-451-6010</gco:CharacterString>
              </gmd:facsimile>
            </gmd:CI_Telephone>
          </gmd:phone>
          <gmd:address>
            <gmd:CI_Address>
              <gmd:deliveryPoint xsi:type="gmd:PT_FreeText_PropertyType">
                <gco:CharacterString>77 Westmorland Street, suite 260</gco:CharacterString>
                <gmd:PT_FreeText>
                  <gmd:textGroup>
                    <gmd:LocalisedCharacterString locale="#fr">77 rue Westmorland, suite 260</gmd:LocalisedCharacterString>
                  </gmd:textGroup>
                </gmd:PT_FreeText>
              </gmd:deliveryPoint>
              <gmd:city xsi:type="gmd:PT_FreeText_PropertyType">
                <gco:CharacterString>Fredericton</gco:CharacterString>
                <gmd:PT_FreeText>
                  <gmd:textGroup>
                    <gmd:LocalisedCharacterString locale="#fr">Frédéricton</gmd:LocalisedCharacterString>
                  </gmd:textGroup>
                </gmd:PT_FreeText>
              </gmd:city>
              <gmd:administrativeArea xsi:type="gmd:PT_FreeText_PropertyType">
                <gco:CharacterString>NB</gco:CharacterString>
                <gmd:PT_FreeText>
                  <gmd:textGroup>
                    <gmd:LocalisedCharacterString locale="#fr">NB</gmd:LocalisedCharacterString>
                  </gmd:textGroup>
                </gmd:PT_FreeText>
              </gmd:administrativeArea>
              <gmd:postalCode>
                <gco:CharacterString>E3B 6Z4</gco:CharacterString>
              </gmd:postalCode>
              <gmd:country xsi:type="gmd:PT_FreeText_PropertyType">
                <gco:CharacterString>Canada</gco:CharacterString>
                <gmd:PT_FreeText>
                  <gmd:textGroup>
                    <gmd:LocalisedCharacterString locale="#fr">Canada (le)</gmd:LocalisedCharacterString>
                  </gmd:textGroup>
                </gmd:PT_FreeText>
              </gmd:country>
              <gmd:electronicMailAddress>
                <gco:CharacterString>[email protected]</gco:CharacterString>
              </gmd:electronicMailAddress>
            </gmd:CI_Address>
          </gmd:address>
          <gmd:onlineResource>
            <gmd:CI_OnlineResource>
              <gmd:linkage>
                <gmd:URL>https://www.canada.ca/en/environment-climate-change.html</gmd:URL>
              </gmd:linkage>
              <gmd:protocol>
                <gco:CharacterString>WWW:LINK</gco:CharacterString>
              </gmd:protocol>
              <gmd:function>
                <gmd:CI_OnLineFunctionCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_OnLineFunctionCode" codeListValue="information" codeSpace="ISOTC211/19115">information</gmd:CI_OnLineFunctionCode>
              </gmd:function>
            </gmd:CI_OnlineResource>
          </gmd:onlineResource>
          <gmd:hoursOfService xsi:type="gmd:PT_FreeText_PropertyType">
            <gco:CharacterString>0700h - 1500h EST</gco:CharacterString>
            <gmd:PT_FreeText>
              <gmd:textGroup>
                <gmd:LocalisedCharacterString locale="#fr">0700h - 1500h HNE</gmd:LocalisedCharacterString>
              </gmd:textGroup>
            </gmd:PT_FreeText>
          </gmd:hoursOfService>
          <gmd:contactInstructions xsi:type="gmd:PT_FreeText_PropertyType">
            <gco:CharacterString>email</gco:CharacterString>
            <gmd:PT_FreeText>
              <gmd:textGroup>
                <gmd:LocalisedCharacterString locale="#fr">courriel</gmd:LocalisedCharacterString>
              </gmd:textGroup>
            </gmd:PT_FreeText>
          </gmd:contactInstructions>
        </gmd:CI_Contact>
      </gmd:contactInfo>
      <gmd:role>
        <gmd:CI_RoleCode codeList="http://wis.wmo.int/2011/schemata/iso19139_2007/schema/resources/Codelist/gmxCodelists.xml#CI_RoleCode" codeListValue="pointOfContact" codeSpace="ISOTC211/19115">pointOfContact</gmd:CI_RoleCode>
      </gmd:role>
    </gmd:CI_ResponsibleParty>
  </gmd:contact>
  <gmd:dateStamp>
    <gco:Date>2021-05-16</gco:Date>
  </gmd:dateStamp>
  <gmd:metadataStandardName>
    <gco:CharacterString>WMO Core Metadata Profile of ISO 19115 (WMO Core), 2003/Cor.1:2006 (ISO 19115), 2007 (ISO/TS 19139)</gco:CharacterString>
  </gmd:metadataStandardName>
  <gmd:metadataStandardVersion>
    <gco:CharacterString>1.3</gco:CharacterString>
  </gmd:metadataStandardVersion>
  <gmd:dataSetURI>
    <gco:CharacterString>urn:x-msc-smc:md:weather-meteo::nwp.gdps</gco:CharacterString>
  </gmd:dataSetURI>
  <gmd:locale>
    <gmd:PT_Locale id="locale-fr">
      <gmd:languageCode>
        <gmd:LanguageCode codeList="http://www.loc.gov/standards/iso639-2/" codeListValue="fr" codeSpace="ISO 639-2">fr</gmd:LanguageCode>
      </gmd:languageCode>
      <gmd:characterEncoding>
        <gmd:MD_CharacterSetCode codeList="http://wis.wmo.int/2011/schemata/iso19139_2007/schema/resources/Codelist/gmxCodelists.xml#MD_CharacterSetCode" codeListValue="utf8" codeSpace="ISOTC211/19115">utf8</gmd:MD_CharacterSetCode>
      </gmd:characterEncoding>
    </gmd:PT_Locale>
  </gmd:locale>
  <gmd:spatialRepresentationInfo>
  </gmd:spatialRepresentationInfo>
  <gmd:referenceSystemInfo>
    <gmd:MD_ReferenceSystem>
      <gmd:referenceSystemIdentifier>
        <gmd:RS_Identifier>
          <gmd:authority>
            <gmd:CI_Citation>
              <gmd:title>
                <gco:CharacterString>European Petroleum Survey Group (EPSG) Geodetic Parameter Registry</gco:CharacterString>
              </gmd:title>
              <gmd:date>
                <gmd:CI_Date>
                  <gmd:date>
                    <gco:Date>2008-11-12</gco:Date>
                  </gmd:date>
                  <gmd:dateType>
                    <gmd:CI_DateTypeCode codeList="http://wis.wmo.int/2011/schemata/iso19139_2007/schema/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode" codeListValue="publication" codeSpace="ISOTC211/19115">publication</gmd:CI_DateTypeCode>
                  </gmd:dateType>
                </gmd:CI_Date>
              </gmd:date>
              <gmd:citedResponsibleParty>
                <gmd:CI_ResponsibleParty>
                  <gmd:organisationName>
                    <gco:CharacterString>European Petroleum Survey Group</gco:CharacterString>
                  </gmd:organisationName>
                  <gmd:contactInfo>
                    <gmd:CI_Contact>
                      <gmd:onlineResource>
                        <gmd:CI_OnlineResource>
                          <gmd:linkage>
                            <gmd:URL>http://www.epsg-registry.org</gmd:URL>
                          </gmd:linkage>
                        </gmd:CI_OnlineResource>
                      </gmd:onlineResource>
                    </gmd:CI_Contact>
                  </gmd:contactInfo>
                  <gmd:role>
                    <gmd:CI_RoleCode codeList="http://wis.wmo.int/2011/schemata/iso19139_2007/schema/resources/Codelist/gmxCodelists.xml#CI_RoleCode" codeListValue="originator" codeSpace="ISOTC211/19115">originator</gmd:CI_RoleCode>
                  </gmd:role>
                </gmd:CI_ResponsibleParty>
              </gmd:citedResponsibleParty>
            </gmd:CI_Citation>
          </gmd:authority>
          <gmd:code>
            <gco:CharacterString>urn:ogc:def:crs:EPSG:4326</gco:CharacterString>
          </gmd:code>
          <gmd:version>
            <gco:CharacterString>6.18.3</gco:CharacterString>
          </gmd:version>
        </gmd:RS_Identifier>
      </gmd:referenceSystemIdentifier>
    </gmd:MD_ReferenceSystem>
  </gmd:referenceSystemInfo>
  <gmd:identificationInfo>
    <gmd:MD_DataIdentification>
      <gmd:citation>
        <gmd:CI_Citation>
          <gmd:title xsi:type="gmd:PT_FreeText_PropertyType">
            <gco:CharacterString>Global Deterministic Prediction System - GDPS.ETA - Downward longwave radiation flux [W/(m^2)]</gco:CharacterString>
            <gmd:PT_FreeText>
              <gmd:textGroup>
                <gmd:LocalisedCharacterString locale="#fr">Système global de prévision déterministe - GDPS.ETA - Flux radiatif entrant d'ondes longues [W/(m^2)]</gmd:LocalisedCharacterString>
              </gmd:textGroup>
            </gmd:PT_FreeText>
          </gmd:title>
          <gmd:date>
            <gmd:CI_Date>
              <gmd:date>
                <gco:Date>1991-03-12</gco:Date>
              </gmd:date>
              <gmd:dateType>
                <gmd:CI_DateTypeCode codeList="http://wis.wmo.int/2011/schemata/iso19139_2007/schema/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation" codeSpace="ISOTC211/19115">creation</gmd:CI_DateTypeCode>
              </gmd:dateType>
            </gmd:CI_Date>
          </gmd:date>
          <gmd:date>
            <gmd:CI_Date>
              <gmd:date>
                <gco:Date>2021-05-16</gco:Date>
              </gmd:date>
              <gmd:dateType>
                <gmd:CI_DateTypeCode codeList="http://wis.wmo.int/2011/schemata/iso19139_2007/schema/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode" codeListValue="publication" codeSpace="ISOTC211/19115">publication</gmd:CI_DateTypeCode>
              </gmd:dateType>
            </gmd:CI_Date>
          </gmd:date>
          <gmd:identifier>
            <gmd:MD_Identifier>
              <gmd:code>
                <gmx:Anchor xlink:actuate="onRequest" xlink:href="http://dx.doi.org/" xlink:title="DOI">doi:</gmx:Anchor>
              </gmd:code>
            </gmd:MD_Identifier>
          </gmd:identifier>
          <gmd:otherCitationDetails xsi:type="gmd:PT_FreeText_PropertyType">
            <gco:CharacterString>Open Government Licence - Canada (https://open.canada.ca/en/open-government-licence-canada)</gco:CharacterString>
            <gmd:PT_FreeText>
              <gmd:textGroup>
                <gmd:LocalisedCharacterString locale="#fr">Licence du gouvernement ouvert - Canada (https://ouvert.canada.ca/fr/licence-du-gouvernement-ouvert-canada)</gmd:LocalisedCharacterString>
              </gmd:textGroup>
            </gmd:PT_FreeText>
          </gmd:otherCitationDetails>
        </gmd:CI_Citation>
      </gmd:citation>
      <gmd:abstract xsi:type="gmd:PT_FreeText_PropertyType">
        <gco:CharacterString>The Global Deterministic Prediction System (GDPS) carries out physics calculations to arrive at deterministic predictions of atmospheric elements from the current day out to 10 days into the future. Atmospheric elements include temperature, precipitation, cloud cover, wind speed and direction, humidity and others. This product contains raw numerical results of these calculations. Geographical coverage is global. Data is available at horizontal resolution of about 15 km up to 33 vertical levels. Predictions are performed twice a day.</gco:CharacterString>
        <gmd:PT_FreeText>
          <gmd:textGroup>
            <gmd:LocalisedCharacterString locale="#fr">Le Système global de prévision déterministe (SPGD) procède à des calculs physiques afin de produire des prévisions déterministes d'éléments de l'atmosphère du jour présent jusqu'à 10 jours dans le futur. Les éléments de l'atmosphère incluent notamment la température, les précipitations, la couverture nuageuse, la vitesse et direction des vents et l'humidité. Ce produit contient les résultats numériques bruts de ces calculs. La couverture géographique est mondiale. La résolution spatiale horizontale des données est d'environ 15 km distribuées sur au plus 33 niveaux verticaux. Les prévisions sont exécutées deux fois par jour.</gmd:LocalisedCharacterString>
          </gmd:textGroup>
        </gmd:PT_FreeText>
      </gmd:abstract>
      <gmd:credit xsi:type="gmd:PT_FreeText_PropertyType">
        <gco:CharacterString>Open Government Licence - Canada (https://open.canada.ca/en/open-government-licence-canada)</gco:CharacterString>
        <gmd:PT_FreeText>
          <gmd:textGroup>
            <gmd:LocalisedCharacterString locale="#fr">Licence du gouvernement ouvert - Canada (https://ouvert.canada.ca/fr/licence-du-gouvernement-ouvert-canada)</gmd:LocalisedCharacterString>
          </gmd:textGroup>
        </gmd:PT_FreeText>
      </gmd:credit>
      <gmd:status>
        <gmd:MD_ProgressCode codeList="http://wis.wmo.int/2011/schemata/iso19139_2007/schema/resources/Codelist/gmxCodelists.xml#MD_ProgressCode" codeListValue="onGoing" codeSpace="ISOTC211/19115">onGoing</gmd:MD_ProgressCode>
      </gmd:status>
      <gmd:resourceMaintenance>
        <gmd:MD_MaintenanceInformation>
          <gmd:maintenanceAndUpdateFrequency>
            <gmd:MD_MaintenanceFrequencyCode codeList="http://wis.wmo.int/2011/schemata/iso19139_2007/schema/resources/Codelist/gmxCodelists.xml#MD_MaintenanceFrequencyCode" codeListValue="continual" codeSpace="ISOTC211/19115">continual</gmd:MD_MaintenanceFrequencyCode>
          </gmd:maintenanceAndUpdateFrequency>
        </gmd:MD_MaintenanceInformation>
      </gmd:resourceMaintenance>
      <gmd:descriptiveKeywords>
        <gmd:MD_Keywords>
          <gmd:keyword xsi:type="gmd:PT_FreeText_PropertyType">
            <gco:CharacterString>Prediction</gco:CharacterString>
            <gmd:PT_FreeText>
              <gmd:textGroup>
                <gmd:LocalisedCharacterString locale="#fr">Prévision</gmd:LocalisedCharacterString>
              </gmd:textGroup>
            </gmd:PT_FreeText>
          </gmd:keyword>
          <gmd:keyword xsi:type="gmd:PT_FreeText_PropertyType">
            <gco:CharacterString>Global</gco:CharacterString>
            <gmd:PT_FreeText>
              <gmd:textGroup>
                <gmd:LocalisedCharacterString locale="#fr">Global</gmd:LocalisedCharacterString>
              </gmd:textGroup>
            </gmd:PT_FreeText>
          </gmd:keyword>
          <gmd:keyword xsi:type="gmd:PT_FreeText_PropertyType">
            <gco:CharacterString>Deterministic</gco:CharacterString>
            <gmd:PT_FreeText>
              <gmd:textGroup>
                <gmd:LocalisedCharacterString locale="#fr">Déterministe</gmd:LocalisedCharacterString>
              </gmd:textGroup>
            </gmd:PT_FreeText>
          </gmd:keyword>
          <gmd:type>
            <gmd:MD_KeywordTypeCode codeList="http://wis.wmo.int/2011/schemata/iso19139_2007/schema/resources/Codelist/gmxCodelists.xml#MD_KeywordTypeCode" codeListValue="" codeSpace="ISOTC211/19115"/>
          </gmd:type>
          <gmd:thesaurusName>
            <gmd:CI_Citation>
              <gmd:title gco:nilReason="missing"/>
              <gmd:date>
                <gmd:CI_Date>
                  <gmd:date gco:nilReason="missing"/>
                  <gmd:dateType gco:nilReason="missing"/>
                </gmd:CI_Date>
              </gmd:date>
            </gmd:CI_Citation>
          </gmd:thesaurusName>
        </gmd:MD_Keywords>
      </gmd:descriptiveKeywords>
      <gmd:descriptiveKeywords>
        <gmd:MD_Keywords>
          <gmd:keyword xsi:type="gmd:PT_FreeText_PropertyType">
            <gco:CharacterString>Weather forecasts</gco:CharacterString>
            <gmd:PT_FreeText>
              <gmd:textGroup>
                <gmd:LocalisedCharacterString locale="#fr">Prévisions météorologiques</gmd:LocalisedCharacterString>
              </gmd:textGroup>
            </gmd:PT_FreeText>
          </gmd:keyword>
          <gmd:keyword xsi:type="gmd:PT_FreeText_PropertyType">
            <gco:CharacterString>Precipitation</gco:CharacterString>
            <gmd:PT_FreeText>
              <gmd:textGroup>
                <gmd:LocalisedCharacterString locale="#fr">Précipitation</gmd:LocalisedCharacterString>
              </gmd:textGroup>
            </gmd:PT_FreeText>
          </gmd:keyword>
          <gmd:keyword xsi:type="gmd:PT_FreeText_PropertyType">
            <gco:CharacterString>Air temperature</gco:CharacterString>
            <gmd:PT_FreeText>
              <gmd:textGroup>
                <gmd:LocalisedCharacterString locale="#fr">Température de l'air</gmd:LocalisedCharacterString>
              </gmd:textGroup>
            </gmd:PT_FreeText>
          </gmd:keyword>
          <gmd:keyword xsi:type="gmd:PT_FreeText_PropertyType">
            <gco:CharacterString>Humidity</gco:CharacterString>
            <gmd:PT_FreeText>
              <gmd:textGroup>
                <gmd:LocalisedCharacterString locale="#fr">Humidité</gmd:LocalisedCharacterString>
              </gmd:textGroup>
            </gmd:PT_FreeText>
          </gmd:keyword>
          <gmd:keyword xsi:type="gmd:PT_FreeText_PropertyType">
            <gco:CharacterString>Snow</gco:CharacterString>
            <gmd:PT_FreeText>
              <gmd:textGroup>
                <gmd:LocalisedCharacterString locale="#fr">Neige</gmd:LocalisedCharacterString>
              </gmd:textGroup>
            </gmd:PT_FreeText>
          </gmd:keyword>
          <gmd:keyword xsi:type="gmd:PT_FreeText_PropertyType">
            <gco:CharacterString>Wind</gco:CharacterString>
            <gmd:PT_FreeText>
              <gmd:textGroup>
                <gmd:LocalisedCharacterString locale="#fr">Vent</gmd:LocalisedCharacterString>
              </gmd:textGroup>
            </gmd:PT_FreeText>
          </gmd:keyword>
          <gmd:keyword xsi:type="gmd:PT_FreeText_PropertyType">
            <gco:CharacterString>Meteorological data</gco:CharacterString>
            <gmd:PT_FreeText>
              <gmd:textGroup>
                <gmd:LocalisedCharacterString locale="#fr">Données météorologiques</gmd:LocalisedCharacterString>
              </gmd:textGroup>
            </gmd:PT_FreeText>
          </gmd:keyword>
          <gmd:type>
            <gmd:MD_KeywordTypeCode codeList="http://wis.wmo.int/2011/schemata/iso19139_2007/schema/resources/Codelist/gmxCodelists.xml#MD_KeywordTypeCode" codeListValue="theme" codeSpace="ISOTC211/19115">theme</gmd:MD_KeywordTypeCode>
          </gmd:type>
          <gmd:thesaurusName>
            <gmd:CI_Citation>
              <gmd:title gco:nilReason="missing"/>
              <gmd:date>
                <gmd:CI_Date>
                  <gmd:date gco:nilReason="missing"/>
                  <gmd:dateType gco:nilReason="missing"/>
                </gmd:CI_Date>
              </gmd:date>
            </gmd:CI_Citation>
          </gmd:thesaurusName>
        </gmd:MD_Keywords>
      </gmd:descriptiveKeywords>
      <gmd:descriptiveKeywords>
        <gmd:MD_Keywords>
          <gmd:keyword xsi:type="gmd:PT_FreeText_PropertyType">
            <gco:CharacterString>Weather and Climate</gco:CharacterString>
            <gmd:PT_FreeText>
              <gmd:textGroup>
                <gmd:LocalisedCharacterString locale="#fr">Temps et climat</gmd:LocalisedCharacterString>
              </gmd:textGroup>
            </gmd:PT_FreeText>
          </gmd:keyword>
          <gmd:type>
            <gmd:MD_KeywordTypeCode codeList="http://wis.wmo.int/2011/schemata/iso19139_2007/schema/resources/Codelist/gmxCodelists.xml#MD_KeywordTypeCode" codeListValue="" codeSpace="ISOTC211/19115"/>
          </gmd:type>
          <gmd:thesaurusName>
            <gmd:CI_Citation>
              <gmd:title gco:nilReason="missing"/>
              <gmd:date>
                <gmd:CI_Date>
                  <gmd:date gco:nilReason="missing"/>
                  <gmd:dateType gco:nilReason="missing"/>
                </gmd:CI_Date>
              </gmd:date>
            </gmd:CI_Citation>
          </gmd:thesaurusName>
        </gmd:MD_Keywords>
      </gmd:descriptiveKeywords>
      <gmd:descriptiveKeywords>
        <gmd:MD_Keywords>
          <gmd:keyword xsi:type="gmd:PT_FreeText_PropertyType">
            <gco:CharacterString>International</gco:CharacterString>
            <gmd:PT_FreeText>
              <gmd:textGroup>
                <gmd:LocalisedCharacterString locale="#fr">Internationale</gmd:LocalisedCharacterString>
              </gmd:textGroup>
            </gmd:PT_FreeText>
          </gmd:keyword>
          <gmd:type>
            <gmd:MD_KeywordTypeCode codeList="http://wis.wmo.int/2011/schemata/iso19139_2007/schema/resources/Codelist/gmxCodelists.xml#MD_KeywordTypeCode" codeListValue="" codeSpace="ISOTC211/19115"/>
          </gmd:type>
          <gmd:thesaurusName>
            <gmd:CI_Citation>
              <gmd:title gco:nilReason="missing"/>
              <gmd:date>
                <gmd:CI_Date>
                  <gmd:date gco:nilReason="missing"/>
                  <gmd:dateType gco:nilReason="missing"/>
                </gmd:CI_Date>
              </gmd:date>
            </gmd:CI_Citation>
          </gmd:thesaurusName>
        </gmd:MD_Keywords>
      </gmd:descriptiveKeywords>
      <gmd:descriptiveKeywords>
        <gmd:MD_Keywords>
          <gmd:keyword xsi:type="gmd:PT_FreeText_PropertyType">
            <gco:CharacterString>Atmosphere</gco:CharacterString>
            <gmd:PT_FreeText>
              <gmd:textGroup>
                <gmd:LocalisedCharacterString locale="#fr">Atmosphère</gmd:LocalisedCharacterString>
              </gmd:textGroup>
            </gmd:PT_FreeText>
          </gmd:keyword>
          <gmd:type>
            <gmd:MD_KeywordTypeCode codeList="http://wis.wmo.int/2011/schemata/iso19139_2007/schema/resources/Codelist/gmxCodelists.xml#MD_KeywordTypeCode" codeListValue="" codeSpace="ISOTC211/19115"/>
          </gmd:type>
          <gmd:thesaurusName>
            <gmd:CI_Citation>
              <gmd:title gco:nilReason="missing"/>
              <gmd:date>
                <gmd:CI_Date>
                  <gmd:date gco:nilReason="missing"/>
                  <gmd:dateType gco:nilReason="missing"/>
                </gmd:CI_Date>
              </gmd:date>
            </gmd:CI_Citation>
          </gmd:thesaurusName>
        </gmd:MD_Keywords>
      </gmd:descriptiveKeywords>
      <gmd:descriptiveKeywords>
        <gmd:MD_Keywords>
          <gmd:keyword>
            <gco:CharacterString>weatherObservations</gco:CharacterString>
          </gmd:keyword>
          <gmd:type>
            <gmd:MD_KeywordTypeCode codeList="http://wis.wmo.int/2011/schemata/iso19139_2007/schema/resources/Codelist/gmxCodelists.xml#MD_KeywordTypeCode" codeListValue="theme" codeSpace="ISOTC211/19115">theme</gmd:MD_KeywordTypeCode>
          </gmd:type>
          <gmd:thesaurusName>
            <gmd:CI_Citation>
              <gmd:title>
                <gmx:Anchor xlink:href="http://wis.wmo.int/2012/codelists/WMOCodeLists.xml#WMO_CategoryCode"/>
              </gmd:title>
              <gmd:date>
                <gmd:CI_Date>
                  <gmd:date>
                    <gco:Date>2013-07-11</gco:Date>
                  </gmd:date>
                  <gmd:dateType>
                    <gmd:CI_DateTypeCode codeList="http://wis.wmo.int/2011/schemata/iso19139_2007/schema/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode" codeListValue="publication" codeSpace="ISOTC211/19115">publication</gmd:CI_DateTypeCode>
                  </gmd:dateType>
                </gmd:CI_Date>
              </gmd:date>
            </gmd:CI_Citation>
          </gmd:thesaurusName>
        </gmd:MD_Keywords>
      </gmd:descriptiveKeywords>
      <gmd:resourceConstraints>
        <gmd:MD_LegalConstraints>
          <gmd:accessConstraints>
            <gmd:MD_RestrictionCode codeList="http://wis.wmo.int/2011/schemata/iso19139_2007/schema/resources/Codelist/gmxCodelists.xml#MD_RestrictionCode" codeListValue="otherRestrictions" codeSpace="ISOTC211/19115">otherRestrictions</gmd:MD_RestrictionCode>
          </gmd:accessConstraints>
          <gmd:otherConstraints>
            <gco:CharacterString>WMOEssential</gco:CharacterString>
          </gmd:otherConstraints>
          <gmd:otherConstraints>
            <gco:CharacterString>GTSPriority1</gco:CharacterString>
          </gmd:otherConstraints>
        </gmd:MD_LegalConstraints>
      </gmd:resourceConstraints>
      <gmd:spatialRepresentationType>
        <gmd:MD_SpatialRepresentationTypeCode codeList="http://wis.wmo.int/2011/schemata/iso19139_2007/schema/resources/Codelist/gmxCodelists.xml#MD_SpatialRepresentationTypeCode" codeListValue="grid" codeSpace="ISOTC211/19115">grid</gmd:MD_SpatialRepresentationTypeCode>
      </gmd:spatialRepresentationType>
      <gmd:language>
        <gmd:LanguageCode codeList="http://www.loc.gov/standards/iso639-2/" codeListValue="eng; CAN" codeSpace="ISO 639-2">eng; CAN</gmd:LanguageCode>
      </gmd:language>
      <gmd:characterSet>
        <gmd:MD_CharacterSetCode codeList="http://wis.wmo.int/2011/schemata/iso19139_2007/schema/resources/Codelist/gmxCodelists.xml#MD_CharacterSetCode" codeListValue="utf8" codeSpace="ISOTC211/19115">utf8</gmd:MD_CharacterSetCode>
      </gmd:characterSet>
      <gmd:topicCategory>
        <gmd:MD_TopicCategoryCode>climatologyMeteorologyAtmosphere</gmd:MD_TopicCategoryCode>
      </gmd:topicCategory>
      <gmd:extent>
        <gmd:EX_Extent>
          <gmd:geographicElement>
            <gmd:EX_GeographicBoundingBox>
              <gmd:extentTypeCode>
                <gco:Boolean>1</gco:Boolean>
              </gmd:extentTypeCode>
              <gmd:westBoundLongitude>
                <gco:Decimal>-180</gco:Decimal>
              </gmd:westBoundLongitude>
              <gmd:eastBoundLongitude>
                <gco:Decimal>180</gco:Decimal>
              </gmd:eastBoundLongitude>
              <gmd:southBoundLatitude>
                <gco:Decimal>-90</gco:Decimal>
              </gmd:southBoundLatitude>
              <gmd:northBoundLatitude>
                <gco:Decimal>90</gco:Decimal>
              </gmd:northBoundLatitude>
            </gmd:EX_GeographicBoundingBox>
          </gmd:geographicElement>
          <gmd:temporalElement>
            <gmd:EX_TemporalExtent>
              <gmd:extent>
                <gml:TimePeriod gml:id="T001">
                  <gml:beginPosition>1963-10-01</gml:beginPosition>
                  <gml:endPosition indeterminatePosition="now"/>
                </gml:TimePeriod>
              </gmd:extent>
            </gmd:EX_TemporalExtent>
          </gmd:temporalElement>
        </gmd:EX_Extent>
      </gmd:extent>
      <gmd:supplementalInformation xsi:type="gmd:PT_FreeText_PropertyType">
        <gco:CharacterString>https://eccc-msc.github.io/open-data/msc-data/nwp_gdps/readme_gdps_en/</gco:CharacterString>
        <gmd:PT_FreeText>
          <gmd:textGroup>
            <gmd:LocalisedCharacterString locale="#fr">https://eccc-msc.github.io/open-data/msc-data/nwp_gdps/readme_gdps_fr/</gmd:LocalisedCharacterString>
          </gmd:textGroup>
        </gmd:PT_FreeText>
      </gmd:supplementalInformation>
    </gmd:MD_DataIdentification>
  </gmd:identificationInfo>
  <gmd:distributionInfo>
    <gmd:MD_Distribution>
      <gmd:distributor>
        <gmd:MD_Distributor>
          <gmd:distributorContact>
            <gmd:CI_ResponsibleParty id="contact-distributor">
              <gmd:individualName>
                <gco:CharacterString>National Inquiry Response Team / Équipe nationale de réponse des demandes du public</gco:CharacterString>
              </gmd:individualName>
              <gmd:organisationName xsi:type="gmd:PT_FreeText_PropertyType">
                <gco:CharacterString>Government of Canada; Environment and Climate Change Canada; Meteorological Service of Canada</gco:CharacterString>
                <gmd:PT_FreeText>
                  <gmd:textGroup>
                    <gmd:LocalisedCharacterString locale="#fr">Gouvernement du Canada; Environnement et Changement climatique Canada; Service météorologique du Canada</gmd:LocalisedCharacterString>
                  </gmd:textGroup>
                </gmd:PT_FreeText>
              </gmd:organisationName>
              <gmd:positionName xsi:type="gmd:PT_FreeText_PropertyType">
                <gco:CharacterString>National Inquiry Response Team</gco:CharacterString>
                <gmd:PT_FreeText>
                  <gmd:textGroup>
                    <gmd:LocalisedCharacterString locale="#fr">Équipe nationale de réponse des demandes du public</gmd:LocalisedCharacterString>
                  </gmd:textGroup>
                </gmd:PT_FreeText>
              </gmd:positionName>
              <gmd:contactInfo>
                <gmd:CI_Contact>
                  <gmd:phone>
                    <gmd:CI_Telephone>
                      <gmd:voice>
                        <gco:CharacterString>+01-819-997-2800</gco:CharacterString>
                      </gmd:voice>
                      <gmd:facsimile>
                        <gco:CharacterString>+01-506-451-6010</gco:CharacterString>
                      </gmd:facsimile>
                    </gmd:CI_Telephone>
                  </gmd:phone>
                  <gmd:address>
                    <gmd:CI_Address>
                      <gmd:deliveryPoint xsi:type="gmd:PT_FreeText_PropertyType">
                        <gco:CharacterString>77 Westmorland Street, suite 260</gco:CharacterString>
                        <gmd:PT_FreeText>
                          <gmd:textGroup>
                            <gmd:LocalisedCharacterString locale="#fr">77 rue Westmorland, suite 260</gmd:LocalisedCharacterString>
                          </gmd:textGroup>
                        </gmd:PT_FreeText>
                      </gmd:deliveryPoint>
                      <gmd:city xsi:type="gmd:PT_FreeText_PropertyType">
                        <gco:CharacterString>Fredericton</gco:CharacterString>
                        <gmd:PT_FreeText>
                          <gmd:textGroup>
                            <gmd:LocalisedCharacterString locale="#fr">Frédéricton</gmd:LocalisedCharacterString>
                          </gmd:textGroup>
                        </gmd:PT_FreeText>
                      </gmd:city>
                      <gmd:administrativeArea xsi:type="gmd:PT_FreeText_PropertyType">
                        <gco:CharacterString>NB</gco:CharacterString>
                        <gmd:PT_FreeText>
                          <gmd:textGroup>
                            <gmd:LocalisedCharacterString locale="#fr">NB</gmd:LocalisedCharacterString>
                          </gmd:textGroup>
                        </gmd:PT_FreeText>
                      </gmd:administrativeArea>
                      <gmd:postalCode>
                        <gco:CharacterString>E3B 6Z4</gco:CharacterString>
                      </gmd:postalCode>
                      <gmd:country xsi:type="gmd:PT_FreeText_PropertyType">
                        <gco:CharacterString>Canada</gco:CharacterString>
                        <gmd:PT_FreeText>
                          <gmd:textGroup>
                            <gmd:LocalisedCharacterString locale="#fr">Canada (le)</gmd:LocalisedCharacterString>
                          </gmd:textGroup>
                        </gmd:PT_FreeText>
                      </gmd:country>
                      <gmd:electronicMailAddress>
                        <gco:CharacterString>[email protected]</gco:CharacterString>
                      </gmd:electronicMailAddress>
                    </gmd:CI_Address>
                  </gmd:address>
                  <gmd:onlineResource>
                    <gmd:CI_OnlineResource>
                      <gmd:linkage>
                        <gmd:URL>https://www.canada.ca/en/environment-climate-change.html</gmd:URL>
                      </gmd:linkage>
                      <gmd:protocol>
                        <gco:CharacterString>WWW:LINK</gco:CharacterString>
                      </gmd:protocol>
                      <gmd:function>
                        <gmd:CI_OnLineFunctionCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_OnLineFunctionCode" codeListValue="information" codeSpace="ISOTC211/19115">information</gmd:CI_OnLineFunctionCode>
                      </gmd:function>
                    </gmd:CI_OnlineResource>
                  </gmd:onlineResource>
                  <gmd:hoursOfService xsi:type="gmd:PT_FreeText_PropertyType">
                    <gco:CharacterString>0700h - 1500h EST</gco:CharacterString>
                    <gmd:PT_FreeText>
                      <gmd:textGroup>
                        <gmd:LocalisedCharacterString locale="#fr">0700h - 1500h HNE</gmd:LocalisedCharacterString>
                      </gmd:textGroup>
                    </gmd:PT_FreeText>
                  </gmd:hoursOfService>
                  <gmd:contactInstructions xsi:type="gmd:PT_FreeText_PropertyType">
                    <gco:CharacterString>email</gco:CharacterString>
                    <gmd:PT_FreeText>
                      <gmd:textGroup>
                        <gmd:LocalisedCharacterString locale="#fr">courriel</gmd:LocalisedCharacterString>
                      </gmd:textGroup>
                    </gmd:PT_FreeText>
                  </gmd:contactInstructions>
                </gmd:CI_Contact>
              </gmd:contactInfo>
              <gmd:role>
                <gmd:CI_RoleCode codeList="http://wis.wmo.int/2011/schemata/iso19139_2007/schema/resources/Codelist/gmxCodelists.xml#CI_RoleCode" codeListValue="distributor" codeSpace="ISOTC211/19115">distributor</gmd:CI_RoleCode>
              </gmd:role>
            </gmd:CI_ResponsibleParty>
          </gmd:distributorContact>
        </gmd:MD_Distributor>
      </gmd:distributor>
      <gmd:transferOptions>
        <gmd:MD_DigitalTransferOptions>
          <gmd:onLine>
            <gmd:CI_OnlineResource>
              <gmd:linkage>
                <gmd:URL>https://dd.weather.gc.ca/model_gem_global/</gmd:URL>
              </gmd:linkage>
              <gmd:protocol>
                <gco:CharacterString>WWW:LINK</gco:CharacterString>
              </gmd:protocol>
              <gmd:name xsi:type="gmd:PT_FreeText_PropertyType">
                <gco:CharacterString>MSC Datamart</gco:CharacterString>
                <gmd:PT_FreeText>
                  <gmd:textGroup>
                    <gmd:LocalisedCharacterString locale="#fr">Datamart du SMC</gmd:LocalisedCharacterString>
                  </gmd:textGroup>
                </gmd:PT_FreeText>
              </gmd:name>
              <gmd:description xsi:type="gmd:PT_FreeText_PropertyType">
                <gco:CharacterString>The Meteorological Service of Canada (MSC) HTTP data server is a source of several raw meteorological data types and forecast data. This service is aimed at specialized users with good meteorological and IT knowledge, and is mainly meant to be accessed in an automatic manner via the internet (e.g. with scripts). The server's URL is http://dd.weather.gc.ca/</gco:CharacterString>
                <gmd:PT_FreeText>
                  <gmd:textGroup>
                    <gmd:LocalisedCharacterString locale="#fr">Le Service météorologique du Canada (SMC) met à la disposition des usagers spécialisés une multitude de données météorologiques et prévisionnelles sur son serveur de données HTTP, à l'adresse http://dd.meteo.gc.ca/ Les usagers qui désirent accéder à ces données doivent avoir une bonne connaissance de la météorologie et de l'informatique afin d'en faire bon usage. Le mode d'accès privilégié est via des routines d'accès automatiques (scripts).</gmd:LocalisedCharacterString>
                  </gmd:textGroup>
                </gmd:PT_FreeText>
              </gmd:description>
              <gmd:function>
                <gmd:CI_OnLineFunctionCode codeList="http://wis.wmo.int/2011/schemata/iso19139_2007/schema/resources/Codelist/gmxCodelists.xml#CI_OnLineFunctionCode" codeListValue="download" codeSpace="ISOTC211/19115">download</gmd:CI_OnLineFunctionCode>
              </gmd:function>
            </gmd:CI_OnlineResource>
          </gmd:onLine>
          <gmd:onLine>
            <gmd:CI_OnlineResource>
              <gmd:linkage>
                <gmd:URL>https://geo.weather.gc.ca/geomet?service=WMS&amp;version=1.3.0&amp;request=GetCapabilities&amp;layer=GDPS.ETA_AD</gmd:URL>
              </gmd:linkage>
              <gmd:protocol>
                <gco:CharacterString>OGC:WMS</gco:CharacterString>
              </gmd:protocol>
              <gmd:name xsi:type="gmd:PT_FreeText_PropertyType">
                <gco:CharacterString>GDPS.ETA - Downward longwave radiation flux [W/(m^2)]</gco:CharacterString>
                <gmd:PT_FreeText>
                  <gmd:textGroup>
                    <gmd:LocalisedCharacterString locale="#fr">GDPS.ETA - Flux radiatif entrant d'ondes longues [W/(m^2)]</gmd:LocalisedCharacterString>
                  </gmd:textGroup>
                </gmd:PT_FreeText>
              </gmd:name>
              <gmd:description xsi:type="gmd:PT_FreeText_PropertyType">
                <gco:CharacterString>The Global Deterministic Prediction System (GDPS) carries out physics calculations to arrive at deterministic predictions of atmospheric elements from the current day out to 10 days into the future. Atmospheric elements include temperature, precipitation, cloud cover, wind speed and direction, humidity and others. This product contains raw numerical results of these calculations. Geographical coverage is global. Data is available at horizontal resolution of about 15 km up to 33 vertical levels. Predictions are performed twice a day.</gco:CharacterString>
                <gmd:PT_FreeText>
                  <gmd:textGroup>
                    <gmd:LocalisedCharacterString locale="#fr">Le Système global de prévision déterministe (SPGD) procède à des calculs physiques afin de produire des prévisions déterministes d'éléments de l'atmosphère du jour présent jusqu'à 10 jours dans le futur. Les éléments de l'atmosphère incluent notamment la température, les précipitations, la couverture nuageuse, la vitesse et direction des vents et l'humidité. Ce produit contient les résultats numériques bruts de ces calculs. La couverture géographique est mondiale. La résolution spatiale horizontale des données est d'environ 15 km distribuées sur au plus 33 niveaux verticaux. Les prévisions sont exécutées deux fois par jour.</gmd:LocalisedCharacterString>
                  </gmd:textGroup>
                </gmd:PT_FreeText>
              </gmd:description>
              <gmd:function>
                <gmd:CI_OnLineFunctionCode codeList="http://wis.wmo.int/2011/schemata/iso19139_2007/schema/resources/Codelist/gmxCodelists.xml#CI_OnLineFunctionCode" codeListValue="download" codeSpace="ISOTC211/19115">download</gmd:CI_OnLineFunctionCode>
              </gmd:function>
            </gmd:CI_OnlineResource>
          </gmd:onLine>
          <gmd:onLine>
            <gmd:CI_OnlineResource>
              <gmd:linkage>
                <gmd:URL>amqps://dd.weather.gc.ca/model_gem_global.#</gmd:URL>
              </gmd:linkage>
              <gmd:protocol>
                <gco:CharacterString>OASIS:AMQP</gco:CharacterString>
              </gmd:protocol>
              <gmd:name xsi:type="gmd:PT_FreeText_PropertyType">
                <gco:CharacterString>MSC Datamart AMQP</gco:CharacterString>
                <gmd:PT_FreeText>
                  <gmd:textGroup>
                    <gmd:LocalisedCharacterString locale="#fr">Datamart du SMC AMQP</gmd:LocalisedCharacterString>
                  </gmd:textGroup>
                </gmd:PT_FreeText>
              </gmd:name>
              <gmd:description xsi:type="gmd:PT_FreeText_PropertyType">
                <gco:CharacterString>The HTTP Open Data server called 'MSC Datamart' is a real-time on-demand download service. The user must, in effect, act to retrieve a particular data, and the request will only be successful if the data was previously published on the server. The exact time of publication of the data on the Datamart is more or less predictable: a new weather warning can appear at any time, while other data are produced on a fairly regular schedule (but still subject to occasional interruptions). However, it may be important for some applications that data is obtained as soon as it is published.    Attempts to obtain Datamart data as soon as they appear on the server generate numerous premature queries that are obviously unsuccessful. This motivates the use of a more elegant and convenient solution for users.</gco:CharacterString>
                <gmd:PT_FreeText>
                  <gmd:textGroup>
                    <gmd:LocalisedCharacterString locale="#fr">Le serveur de données ouvertes HTTP appelé le 'Datamart du SMC' est un service de téléchargement en temps réel, sur demande. L'usager doit en effet agir pour demander une donnée particulière, et la demande n'aura de succès que si la donnée a été préalablement publiée sur le serveur. Le moment exact de l'apparition des données sur le Datamart est plus ou moins prévisible : un nouvel avertissement météorologique peut y apparaître à tout moment, alors que certaines autres données ont un horaire de production assez régulier (mais tout de même sujet à des perturbations occasionnelles). Or, il peut être important pour certaines applications d'obtenir des données dès leur publication. Les tentatives d'obtenir des données du Datamart dès leur apparition sur le serveur génèrent de nombreuses requêtes prématurées qui sont évidemment infructueuses. Ceci motive l'utilisation d'une solution plus élégante et plus commode pour les usagers.</gmd:LocalisedCharacterString>
                  </gmd:textGroup>
                </gmd:PT_FreeText>
              </gmd:description>
              <gmd:function>
                <gmd:CI_OnLineFunctionCode codeList="http://wis.wmo.int/2011/schemata/iso19139_2007/schema/resources/Codelist/gmxCodelists.xml#CI_OnLineFunctionCode" codeListValue="download" codeSpace="ISOTC211/19115">download</gmd:CI_OnLineFunctionCode>
              </gmd:function>
            </gmd:CI_OnlineResource>
          </gmd:onLine>
        </gmd:MD_DigitalTransferOptions>
      </gmd:transferOptions>
    </gmd:MD_Distribution>
  </gmd:distributionInfo>
  <gmd:metadataMaintenance>
    <gmd:MD_MaintenanceInformation>
      <gmd:maintenanceAndUpdateFrequency>
        <gmd:MD_MaintenanceFrequencyCode codeList="http://wis.wmo.int/2011/schemata/iso19139_2007/schema/resources/Codelist/gmxCodelists.xml#MD_MaintenanceFrequencyCode" codeListValue="continual" codeSpace="ISOTC211/19115">continual</gmd:MD_MaintenanceFrequencyCode>
      </gmd:maintenanceAndUpdateFrequency>
      <gmd:maintenanceNote>
        <gco:CharacterString>This metadata record was generated by pygeometa-0.7.dev0 (https://github.com/geopython/pygeometa)</gco:CharacterString>
      </gmd:maintenanceNote>
    </gmd:MD_MaintenanceInformation>
  </gmd:metadataMaintenance>
</gmd:MD_Metadata>

XPathEvalError: Undefined namespace prefix

Hi running the KPI-analysis over the file de.bafg.grdc.7c706276-caaa-493d-94a4-d2960e83a9ae.xml produces the following error:

/usr/local/lib/python3.7/site-packages/pywcmp-0.4.dev0-py3.7.egg/pywcmp/kpi.py in kpi_004(self)
    332 
    333         LOGGER.debug(f'Testing for temporal information at "{time_period_xpath}"')
--> 334         time_periods = self.exml.xpath(time_period_xpath, namespaces=self.namespaces)
    335 
    336         if len(time_periods) > 0:

src/lxml/etree.pyx in lxml.etree._ElementTree.xpath()

src/lxml/xpath.pxi in lxml.etree.XPathDocumentEvaluator.__call__()

src/lxml/xpath.pxi in lxml.etree._XPathEvaluatorBase._handle_result()

XPathEvalError: Undefined namespace prefix

I suspect this is because this file is missing a definition for the 'gml' namespace

<gmd:MD_Metadata xmlns:srv="http://www.isotc211.org/2005/srv" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd" xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/csw/2.0.2/profiles/apiso/1.0.0/apiso.xsd" >

and 'gml' is referenced in the xpath-defintion:

time_period_xpath = '/gmd:MD_Metadata/gmd:identificationInfo//gmd:temporalElement/gmd:EX_TemporalExtent/gmd:extent/gml:TimePeriod'

ParserError: String does not contain a date: begin

Analysis for metadata-files such as urn_x-wmo_md_int.wmo.wis__FXPQ31RJTD.xml with the following error:

/usr/local/lib/python3.7/site-packages/pywcmp-0.4.dev0-py3.7.egg/pywcmp/kpi.py in kpi_004(self)
    342                 if begin_position is not None and end_position is not None:
    343                     score += 1
--> 344                     dt_begin = parse_time_position(begin_position)
    345                     dt_end = parse_time_position(end_position)
    346                     if dt_begin is not None and dt_end is not None:

/usr/local/lib/python3.7/site-packages/pywcmp-0.4.dev0-py3.7.egg/pywcmp/util.py in parse_time_position(element)
    191         if text_to_parse.endswith('Z'):
    192             text_to_parse = text_to_parse[0:-1]
--> 193         dtg = parse(text_to_parse, fuzzy=True, ignoretz=True).replace(tzinfo=timezone.utc)
    194         return dtg
    195     return None

~/.local/lib/python3.7/site-packages/dateutil/parser/_parser.py in parse(timestr, parserinfo, **kwargs)
   1366         return parser(parserinfo).parse(timestr, **kwargs)
   1367     else:
-> 1368         return DEFAULTPARSER.parse(timestr, **kwargs)
   1369 
   1370 

~/.local/lib/python3.7/site-packages/dateutil/parser/_parser.py in parse(self, timestr, default, ignoretz, tzinfos, **kwargs)
    644 
    645         if len(res) == 0:
--> 646             raise ParserError("String does not contain a date: %s", timestr)
    647 
    648         try:

ParserError: String does not contain a date: begin

Change scoring in KPI-3

Instead of "-1" (decrementing score) for records with GTS bulletin header in the abstract, add one point to the ones that do not have it. This matches changes in the KPI definition done by Anna Milan.

add WCMP 1 to WCMP 2 migration tool

As discussed at TT-WISMD 2022-06-15, providing a migration utility for WCMP1 to WCMP2 (i.e. something like pywcmp migrate foo.xml foo.json) will be of value to organizations with existing WCMP1/XML tooling/workflow.

Note that the utility should include clear disclaimers that simply converting from WCMP1 to WCMP2 (lift-and-shift) does not constitute WIS 2.0 compliant metadata and users will be required to review WCMP2 proper to ensure granularity and quality are considered.

cc @solson-nws

Allow gmx:Anchor in the resource constraints that define data license code

Resource constraints such as the famous data license code can be either a character string or an anchor, that is, the Xpath can be either:
/gmd:MD_Metadata/gmd:identificationInfo//gmd:resourceConstraints/gmd:MD_LegalConstraints/gmd:otherConstraints/gco:CharacterString
or
/gmd:MD_Metadata/gmd:identificationInfo//gmd:resourceConstraints/gmd:MD_LegalConstraints/gmd:otherConstraints/gmx:Anchor.
In fact, the anchor is preferred in KPIs. Unfortunately, the pywcmp tool has Xpath hard-coded to the CharacterString.

kpi_008: RemoteDisconnected: Remote end closed connection without response

When checking links for kpi_008 pywcmp occassionally crashes due to not getting an response. For example for identifier: 'urn:x-wmo:md:int.wmo.wis::CUIS01LLBD'

I also note that the code does not specify a specific time-out error: response = urlopen(url, context=context)
Could we add a fixed timeout response = urlopen(url, context=context,timeout=timeout) (5 seconds? 30 seconds?) to wait to validate a link and ensure the code catches the RemoteDisconnected-Exception ?

/usr/local/lib/python3.7/site-packages/pywcmp-0.4.dev0-py3.7.egg/pywcmp/kpi.py in kpi_008(self)
    591         for link in links:
    592             LOGGER.debug(f'checking: {link}')
--> 593             result = check_url(link, False)
    594             total += 2
    595             if result['accessible']:

/usr/local/lib/python3.7/site-packages/pywcmp-0.4.dev0-py3.7.egg/pywcmp/util.py in check_url(url, check_ssl)
    308             result['ssl'] = False
    309             context = ssl._create_unverified_context()
--> 310             response = urlopen(url, context=context)
    311         else:
    312             response = urlopen(url)

/usr/local/lib/python3.7/urllib/request.py in urlopen(url, data, timeout, cafile, capath, cadefault, context)
    220     else:
    221         opener = _opener
--> 222     return opener.open(url, data, timeout)
    223 
    224 def install_opener(opener):

/usr/local/lib/python3.7/urllib/request.py in open(self, fullurl, data, timeout)
    523             req = meth(req)
    524 
--> 525         response = self._open(req, data)
    526 
    527         # post-process response

/usr/local/lib/python3.7/urllib/request.py in _open(self, req, data)
    541         protocol = req.type
    542         result = self._call_chain(self.handle_open, protocol, protocol +
--> 543                                   '_open', req)
    544         if result:
    545             return result

/usr/local/lib/python3.7/urllib/request.py in _call_chain(self, chain, kind, meth_name, *args)
    501         for handler in handlers:
    502             func = getattr(handler, meth_name)
--> 503             result = func(*args)
    504             if result is not None:
    505                 return result

/usr/local/lib/python3.7/urllib/request.py in http_open(self, req)
   1376 
   1377     def http_open(self, req):
-> 1378         return self.do_open(http.client.HTTPConnection, req)
   1379 
   1380     http_request = AbstractHTTPHandler.do_request_

/usr/local/lib/python3.7/urllib/request.py in do_open(self, http_class, req, **http_conn_args)
   1351             except OSError as err: # timeout error
   1352                 raise URLError(err)
-> 1353             r = h.getresponse()
   1354         except:
   1355             h.close()

/usr/local/lib/python3.7/http/client.py in getresponse(self)
   1371         try:
   1372             try:
-> 1373                 response.begin()
   1374             except ConnectionError:
   1375                 self.close()

/usr/local/lib/python3.7/http/client.py in begin(self)
    317         # read until we get a non-100 response
    318         while True:
--> 319             version, status, reason = self._read_status()
    320             if status != CONTINUE:
    321                 break

/usr/local/lib/python3.7/http/client.py in _read_status(self)
    286             # Presumably, the server closed the connection before
    287             # sending a valid response.
--> 288             raise RemoteDisconnected("Remote end closed connection without"
    289                                      " response")
    290         try:

RemoteDisconnected: Remote end closed connection without response

Use of the test suite when publishing WIS metadata

Hello @wmo-im/tt-wismd
we have a new repository with a test suite for wmo cmp. It was developed by @tomkralidis and it is in use in Canada. I believe that this is an extremely useful tool this is why I asked Tom to move it here from the OGC repository. Can you have a look at it please?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.