diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0cafdb3d8..321274a9d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -36,7 +36,7 @@ repos: - id: ruff - repo: https://github.com/tox-dev/pyproject-fmt - rev: 2.0.4 + rev: 2.1.3 hooks: - id: pyproject-fmt diff --git a/compliance_checker/protocols/netcdf.py b/compliance_checker/protocols/netcdf.py index be99d1e40..94cf7b594 100644 --- a/compliance_checker/protocols/netcdf.py +++ b/compliance_checker/protocols/netcdf.py @@ -25,18 +25,26 @@ def is_netcdf(url): if url.endswith("nc"): return True - # Brute force - with open(url, "rb") as f: - magic_number = f.read(4) - if len(magic_number) < 4: - return False - if is_classic_netcdf(magic_number): - return True - elif is_hdf5(magic_number): - return True - + try: + # Brute force + with open(url, "rb") as f: + magic_number = f.read(4) + if len(magic_number) < 4: + return False + if is_classic_netcdf(magic_number): + return True + elif is_hdf5(magic_number): + return True + except PermissionError: + # open will fail for both a directory or a local url, either of which may be pointing to a Zarr dataset + # directory + return False + except OSError: + # local file url return False + return False + def is_classic_netcdf(file_buffer): """ diff --git a/compliance_checker/protocols/opendap.py b/compliance_checker/protocols/opendap.py index c78363861..b69b3a2a3 100644 --- a/compliance_checker/protocols/opendap.py +++ b/compliance_checker/protocols/opendap.py @@ -55,14 +55,19 @@ def is_opendap(url): das_url = url.replace("#fillmismatch", ".das") else: das_url = url + ".das" - response = requests.get(das_url, allow_redirects=True) - if "xdods-server" in response.headers: - return True - # Check if it is an access restricted ESGF thredds service - if ( - response.status_code == 401 - and "text/html" in response.headers["content-type"] - and "The following URL requires authentication:" in response.text - ): - return True + + try: + response = requests.get(das_url, allow_redirects=True) + + if "xdods-server" in response.headers: + return True + # Check if it is an access restricted ESGF thredds service + if ( + response.status_code == 401 + and "text/html" in response.headers["content-type"] + and "The following URL requires authentication:" in response.text + ): + return True + except requests.exceptions.InvalidSchema: + return False # not opendap if url + ".das" isn't found return False diff --git a/compliance_checker/protocols/zarr.py b/compliance_checker/protocols/zarr.py new file mode 100644 index 000000000..f111624ce --- /dev/null +++ b/compliance_checker/protocols/zarr.py @@ -0,0 +1,81 @@ +import zipfile +from pathlib import Path +from urllib.parse import urlparse +from urllib.request import url2pathname +from zipfile import ZipFile + +from compliance_checker.protocols import netcdf + +# + + +def is_zarr(url): + """Check if a URL is a zarr dataset.""" + url = str(url) + + if netcdf.is_netcdf(url): + return False + + if ".zarr" in url: + return True + + if urlparse(url).scheme in ("https", "s3", "file"): + return True + + if zipfile.is_zipfile(url): + if ".zmetadata" in ZipFile(url).namelist(): + return True + + if Path(url).is_dir(): + if (Path(url) / ".zmetadata").exists(): + return True + + return False + + +def as_zarr(url): + """ + Transform pointers to zarr datasets to valid nczarr urls, as described in + https://www.unidata.ucar.edu/blogs/developer/entry/overview-of-zarr-support-in\n + url: str or Path to valid zarr dataset\n + Distinct from is_cdl etc in that it will return the appropriate URI \n\n + + Not tested on Windows paths at the moment, as NCZarr is not supported in Windows\n + + A valid Zarr dataset could be provided in any of the following forms:\n + "http://s3.amazonaws.com/bucket/dataset.zarr"\n + "http://s3.amazonaws.com/bucket/dataset.zarr"#mode=nczarr,s3\n + "/home/path/to/dataset.zarr"\n + Path('/home/path/to/dataset.zarr')\n + "file:///home/path/to/dataset.zarr"\n + "file:///home/path/to/dataset.randomExt#mode=nczarr,file" + "file:///home/path/to/dataset.zarr#mode=nczarr,zip" + """ + + pr = urlparse(str(url)) + + if "mode=nczarr" in pr.fragment: + if pr.netloc: + return str(url) # already valid nczarr url + elif pr.scheme == "file": + return str(url) # already valid nczarr url + + zarr_url = Path( + url2pathname(pr.path), + ).resolve() # url2pathname necessary to avoid urlparse bug in windows + + if pr.netloc: + mode = "s3" + elif zipfile.is_zipfile(zarr_url): + mode = "zip" + elif zarr_url.is_dir(): + mode = "file" + else: + raise ValueError( + f"Could not identify {url},\nif #mode=nczarr,zarr, please pass this explicitly\nValid url options are described here\nhttps://www.unidata.ucar.edu/blogs/developer/entry/overview-of-zarr-support-in", + ) + + url_base = url if mode == "s3" else zarr_url.as_uri() + + zarr_url = f"{url_base}#mode=nczarr,{mode}" + return zarr_url diff --git a/compliance_checker/suite.py b/compliance_checker/suite.py index 17002da41..60008488b 100644 --- a/compliance_checker/suite.py +++ b/compliance_checker/suite.py @@ -6,6 +6,7 @@ import inspect import itertools import os +import platform import re import subprocess import sys @@ -27,7 +28,7 @@ from compliance_checker import __version__, tempnc from compliance_checker.base import BaseCheck, GenericFile, Result, fix_return_value -from compliance_checker.protocols import cdl, netcdf, opendap +from compliance_checker.protocols import cdl, netcdf, opendap, zarr # Ensure output is encoded as Unicode when checker output is redirected or piped if sys.stdout.encoding is None: @@ -890,6 +891,13 @@ def load_local_dataset(self, ds_str): if cdl.is_cdl(ds_str): ds_str = self.generate_dataset(ds_str) + if zarr.is_zarr(ds_str): + if platform.system() != "Linux": + print( + f"WARNING: {platform.system()} OS detected. NCZarr is not officially supported for your OS as of when this API was written. Your mileage may vary.", + ) + return Dataset(zarr.as_zarr(ds_str)) + if netcdf.is_netcdf(ds_str): return Dataset(ds_str) diff --git a/compliance_checker/tests/cassettes/test_erddap.yaml b/compliance_checker/tests/cassettes/test_erddap.yaml index ac0c6b065..2751627c3 100644 --- a/compliance_checker/tests/cassettes/test_erddap.yaml +++ b/compliance_checker/tests/cassettes/test_erddap.yaml @@ -9,243 +9,7 @@ interactions: Connection: - keep-alive User-Agent: - - python-requests/2.27.1 - method: HEAD - uri: https://coastwatch.pfeg.noaa.gov/erddap/griddap/osu2ChlaAnom - response: - body: - string: '' - headers: - Connection: - - close - Content-Type: - - text/plain; charset=UTF-8 - Date: - - Tue, 24 May 2022 11:35:37 GMT - Last-Modified: - - Tue, 24 May 2022 11:35:37 GMT - Location: - - https://coastwatch.pfeg.noaa.gov/erddap/griddap/osu2ChlaAnom.html - Strict-Transport-Security: - - max-age=31536000; includeSubDomains - Transfer-Encoding: - - chunked - erddap-server: - - '2.18' - xdods-server: - - dods/3.7 - status: - code: 302 - message: '' -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate, br - Connection: - - keep-alive - User-Agent: - - python-requests/2.27.1 - method: HEAD - uri: https://coastwatch.pfeg.noaa.gov/erddap/griddap/osu2ChlaAnom.html - response: - body: - string: '' - headers: - Connection: - - close - Content-Encoding: - - gzip - Content-Type: - - text/html;charset=UTF-8 - Date: - - Tue, 24 May 2022 11:35:48 GMT - Last-Modified: - - Tue, 24 May 2022 11:35:48 GMT - Strict-Transport-Security: - - max-age=31536000; includeSubDomains - Transfer-Encoding: - - chunked - erddap-server: - - '2.18' - xdods-server: - - dods/3.7 - status: - code: 200 - message: '' -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate, br - Connection: - - keep-alive - User-Agent: - - python-requests/2.27.1 - method: HEAD - uri: https://coastwatch.pfeg.noaa.gov/erddap/griddap/osu2ChlaAnom - response: - body: - string: '' - headers: - Connection: - - close - Content-Type: - - text/plain; charset=UTF-8 - Date: - - Tue, 24 May 2022 11:35:59 GMT - Last-Modified: - - Tue, 24 May 2022 11:35:59 GMT - Location: - - https://coastwatch.pfeg.noaa.gov/erddap/griddap/osu2ChlaAnom.html - Strict-Transport-Security: - - max-age=31536000; includeSubDomains - Transfer-Encoding: - - chunked - erddap-server: - - '2.18' - xdods-server: - - dods/3.7 - status: - code: 302 - message: '' -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate, br - Connection: - - keep-alive - User-Agent: - - python-requests/2.27.1 - method: HEAD - uri: https://coastwatch.pfeg.noaa.gov/erddap/griddap/osu2ChlaAnom.html - response: - body: - string: '' - headers: - Connection: - - close - Content-Encoding: - - gzip - Content-Type: - - text/html;charset=UTF-8 - Date: - - Tue, 24 May 2022 11:36:10 GMT - Last-Modified: - - Tue, 24 May 2022 11:36:10 GMT - Strict-Transport-Security: - - max-age=31536000; includeSubDomains - Transfer-Encoding: - - chunked - erddap-server: - - '2.18' - xdods-server: - - dods/3.7 - status: - code: 200 - message: '' -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate, br - Connection: - - keep-alive - User-Agent: - - python-requests/2.27.1 - method: GET - uri: https://coastwatch.pfeg.noaa.gov/erddap/griddap/osu2ChlaAnom.das - response: - body: - string: !!binary | - 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 - headers: - Connection: - - close - Content-Description: - - dods-das - Content-Encoding: - - gzip - Content-Type: - - text/plain;charset=ISO-8859-1 - Date: - - Tue, 24 May 2022 11:38:22 GMT - Last-Modified: - - Tue, 24 May 2022 11:38:22 GMT - Strict-Transport-Security: - - max-age=31536000; includeSubDomains - Transfer-Encoding: - - chunked - erddap-server: - - '2.18' - xdods-server: - - dods/3.7 - status: - code: 200 - message: '' -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate, br - Connection: - - keep-alive - User-Agent: - - python-requests/2.31.0 + - python-requests/2.32.1 method: HEAD uri: https://www.neracoos.org/erddap/griddap/WW3_EastCoast_latest response: @@ -257,21 +21,21 @@ interactions: CF-Cache-Status: - DYNAMIC CF-RAY: - - 7efe624eb969a4c9-GRU + - 887715c77a01b500-OSL Connection: - keep-alive Content-Type: - text/plain Date: - - Tue, 01 Aug 2023 13:21:24 GMT + - Tue, 21 May 2024 19:48:37 GMT Last-Modified: - - Tue, 01 Aug 2023 13:21:24 GMT + - Tue, 21 May 2024 19:48:37 GMT Location: - http://www.neracoos.org/erddap/griddap/WW3_EastCoast_latest.html NEL: - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}' Report-To: - - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=viFC4Bf5eGlUkkeMsFQWDFwYf5ZHPxQk%2BosYpxTON6ysF7qwAvm48YPwpGBfcdwFtB10N5RtEvlB%2FMR3JMGTzwGub%2Fxz1BVqAMrzYtXCIPX7aAgm7NIYWtxS%2FCd4JOf5vEg%3D"}],"group":"cf-nel","max_age":604800}' + - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=gsFx%2BIw8kcnFCTBprj8%2BzrlEU6V7MMkKKj%2FUrRhn2euFM9FC5nSBX0Sz9Ub8IrGvibt76QX5HfwTifnprK4cSPDUWpUHNi7abHtBTYCeXhT1Q4X%2FvuQnHvCm06WFwgwqfk8%3D"}],"group":"cf-nel","max_age":604800}' Server: - cloudflare erddap-server: @@ -291,7 +55,7 @@ interactions: Connection: - keep-alive User-Agent: - - python-requests/2.31.0 + - python-requests/2.32.1 method: HEAD uri: http://www.neracoos.org/erddap/griddap/WW3_EastCoast_latest.html response: @@ -303,7 +67,7 @@ interactions: CF-Cache-Status: - DYNAMIC CF-RAY: - - 7efe6250bfeba6a0-GRU + - 887715c98dabb50b-OSL Connection: - keep-alive Content-Encoding: @@ -311,13 +75,13 @@ interactions: Content-Type: - text/html;charset=UTF-8 Date: - - Tue, 01 Aug 2023 13:21:24 GMT + - Tue, 21 May 2024 19:48:38 GMT Last-Modified: - - Tue, 01 Aug 2023 13:21:24 GMT + - Tue, 21 May 2024 19:48:38 GMT NEL: - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}' Report-To: - - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=Q00158RZNE%2BKAQjfwcwy2tfC2LjllIghoAsK3G4CUs896HjG6euAyLq6IjMCA2hWGT6zvvxcSJkeOyXscutlR99zZ3ocSALXeNYjddkQlW597IEYvCvIdkP8az8o%2F7BdKSU%3D"}],"group":"cf-nel","max_age":604800}' + - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=yY6fyC7W%2BWp8b5cWZMJhQ2PLXFKHzoEYl1a95dbUpF2i4njc65%2FCsFvPZ1rNYeIbI86lTt%2BHM%2BoGVtRcrT0yrELZ%2Bd8mxD6iGRhkKC%2FEdrUba04rZ%2FYlrXvozIizYK6FAUs%3D"}],"group":"cf-nel","max_age":604800}' Server: - cloudflare erddap-server: @@ -337,7 +101,7 @@ interactions: Connection: - keep-alive User-Agent: - - python-requests/2.31.0 + - python-requests/2.32.1 method: HEAD uri: https://www.neracoos.org/erddap/griddap/WW3_EastCoast_latest response: @@ -349,21 +113,21 @@ interactions: CF-Cache-Status: - DYNAMIC CF-RAY: - - 7efe62530ea2a507-GRU + - 887715cbab550b59-OSL Connection: - keep-alive Content-Type: - text/plain Date: - - Tue, 01 Aug 2023 13:21:25 GMT + - Tue, 21 May 2024 19:48:38 GMT Last-Modified: - - Tue, 01 Aug 2023 13:21:25 GMT + - Tue, 21 May 2024 19:48:38 GMT Location: - http://www.neracoos.org/erddap/griddap/WW3_EastCoast_latest.html NEL: - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}' Report-To: - - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=hmDpyHvmx5hrFB01AslIWEzp3Hl%2FubqT8Dr%2FoRriX9%2FkBnjpjEXWFvrlKPRoNNqJtNRMZku7TZrfY6XehkaqgfLfZHXf5exSFwOy7RKPQ%2FCwGMLgC2atVzMLfkdKKUd2A0s%3D"}],"group":"cf-nel","max_age":604800}' + - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=LoRmxf3MYrvBFHRmUXc1T7RvgBB7UjVT8ZwdHNzHW1dn9jW2ucglxETNkojUqvHhLwwFk0V8lVDZo1cmRVpJbGXw7aXgDc1ptApsDTaYUP66wRbjdYUSBoJKsMNpJFzGG88%3D"}],"group":"cf-nel","max_age":604800}' Server: - cloudflare erddap-server: @@ -383,7 +147,7 @@ interactions: Connection: - keep-alive User-Agent: - - python-requests/2.31.0 + - python-requests/2.32.1 method: HEAD uri: http://www.neracoos.org/erddap/griddap/WW3_EastCoast_latest.html response: @@ -395,7 +159,7 @@ interactions: CF-Cache-Status: - DYNAMIC CF-RAY: - - 7efe6254ea801ac9-GRU + - 887715cccbd00afe-OSL Connection: - keep-alive Content-Encoding: @@ -403,13 +167,13 @@ interactions: Content-Type: - text/html;charset=UTF-8 Date: - - Tue, 01 Aug 2023 13:21:25 GMT + - Tue, 21 May 2024 19:48:38 GMT Last-Modified: - - Tue, 01 Aug 2023 13:21:25 GMT + - Tue, 21 May 2024 19:48:38 GMT NEL: - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}' Report-To: - - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=DQoHrp0kk2O6M%2BjNZy8EjrWe631YF8jIZJSXighA8gBWEnVLfcBQcZoLKCVDueG%2B08qYO4KL1rsEWsQP5tm04Xa%2Fd%2FvPf4jTjCFFmij2FNzNF6h3gEalkcC8SaAE48jHr5A%3D"}],"group":"cf-nel","max_age":604800}' + - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=kqPPIUoB2ZotzkmI%2BAGfFx2RkXdqOcVmq%2Fn8wgd5JLCBAH5Co6zBy2OoS%2Fi8SCMr3UqtBHlQai65ROKcdAkkFsICWykYd91FAEE8zX%2Fy9MSGvU949JtGHGpTXhfcsmVcfLI%3D"}],"group":"cf-nel","max_age":604800}' Server: - cloudflare erddap-server: @@ -429,57 +193,57 @@ interactions: Connection: - keep-alive User-Agent: - - python-requests/2.31.0 + - python-requests/2.32.1 method: GET uri: https://www.neracoos.org/erddap/griddap/WW3_EastCoast_latest.das response: body: string: !!binary | - g5UHAMQvm/Xe53J6xclBxI2s4+b8M9UfNUyXQRpLzQSHo3FUiIztIpgvXmq7O3MgGr07JyBJ0Yhw - yUaon8rbGlrXvjYkiLjozCsm7oc6Vf68yhH/zgCVkV8vBHjWIK5Hc+x9sOJI+XAt8WWzYCQvMnLy - C+lLzgZPursNanWioVk068JltrO9tV1X+/xzbX4zw+7uzi7/XP/Cf0ZaS0TykvwhUryPjYzq5gTR - XAfv+sbRyASQM3HWWyNVRm6ivq2PpCjTq8O7tKz3ChTFwRciSdLJiUYkE6p7REzhv2hZ7xVpUaZF - +VKktPm0pcf8/wwYSEUnq8oW35DeblkVWWmws5OVYnHNGfwjGCyRIVl7djeSEjmmNFj8QCjUgvP8 - u8dmQnpJA23jXX+HMmZ/vl1ab2WlQbqzkxX1p8LbpcRVYpwfQHSCitRJDiiplwimqDfbed0S2fwL - WxWaMxmGNxomRlpnda0EiFXwUY4o3NJaxmlEWWQFlY44vAltU8bw8J6n0FHLeKclRxXM9yy9k05a - cko9Glyw9HNNQxlIF5GpCbEyQrOiJTcjqqpr5jyEqhxGe2l9XC0UlG+5oyWdexf474lduxFQI5rb - SnCva93ThSOKr2VbuwXZf/OCyxbGR4yZQZt7rj56oL6xqVUDD200TIhwN//PgLvj5vzm/ujwxmvM - 09qxsaTUaE3v4jyILSJ5x0Sv06l4F5Ec3x8+nTwbHJ+lZbZr8OrEkhJOSCmy4kRidI+hNliWGUBD - gAw3H2ro8R6CuFYWNODSLTmq9KQ+fEl+PwkZmhTj8MAhCLM6whQGJHPVxUGer1ar7Lv4rG+zlvI8 - QFlKiyR+mG70UZtTiiquhyowgB/s2ccFqdDQDKTNSGt4zxGhizhPkPOzR+CBf51RZJWpUCxzht45 - EMLFO0nzLncu3gnO8Dvn3PNCcjO9Q4jFqgMjTv/NSKqi2kqL/bQoX8qtg6o8qHY+4YfBtzSgk4Hj - jzMyudz36zhQ633MfOhzDtbSIu+DfO/z/r5V5G917ClqM5By1MwSAA0lrvOv1qRwJlOERhUtwZmT - I7adDxZtykT3LZPzgWko3Nr2L96sfLARiSUlg1rsZ2CBYRqDUwo6x5F5CG0Zv7O0jz9wfGkJfocX - yBseDICGe14w2/xEFARcezPu2MWgRBIa+JbJfRsnGkSmewKvs/Eq2REq8FXRwBEdwiD6KbScGcQF - szVwBvhDXKxoydHc81sJopYLNK3yJEjOj29PlGJ3TUXYAYyrjoPkZc6AtMQjbfCdEf5pBHIWgcPw - XDFbdD6gC8z4PikkwnmFOGVn2c46HzBwTwOmyKYZ6iLKdonWOyVxEBe1+OatcMxwx6JzDnuwm86S - 0uzYu6b+xj4YnD6dGNzdHx4aOE9IhBwb7llJOaK7wh87ktvMDulFAwlY43Qc5ggfRMgaqFUfokHQ - rIHkNljt3WwH3RjELbpL+DCTcTEI2//MELSJhSN8h66bHGXpBuQsOlHHccHY/jRbRDOKnAYKGEg9 - wMAHHDoJsXmuLPdBGNl1uRQq8t+YWXcoxHGMLBJMkbtp+NXwHXQuER2kIrIqHnLLSh4unz0ZoKO6 - YgfwKewXzYjr2/7cohm8qLhGccQx+bpIngTOSqtAtfGhjs/SsmpC+Ezj+Pd5jy7v8f6Oy8tL3GDg - PDjzgVuKGj2jDfCRqBCs18X8+LrUc8POIqmKcj8tKyQuVHWicpIQYmjBgwXLtKrbUgcWFZwUDPEv - PHp28GXB/8/+nxkD + H4sIAAAAAAAAAL1XUW/bNhB+9684+GnDZNmyEy9OgQKOvWTZnKSo03krBgiMdJaJSqRGUnGMIf99 + R0p2bEd2UxRYkUqkeHe8++7uIz00RvGHwqCGfxsAhmfoBgBTWhAJhCMpVcwFMzh84vp+lSM070ms + +c6JXaaSmf4JsMgULA0VEwlC4J+e9E4G3TP8aeCVs37/tE+zd9u2GRkkY82dj1xKHUa0XSLVamer + SiCVIgkFy7BuURsmYqbiSsC8ErBfQql4wgU0O0Hrt+FtKxj83IFO59z97YoXghvyUWMkRaxBcxFR + eCTfIt1OcL/W+uzUnul/ygw3RfwWGCfMHEOx2/EDD05P/aAGtb+OojaRNOZSHERuUnl5FL20VqiC + JMZEIepQSGUWL9HTFm8Of+NfbfitQc/G3yIAOoPtfyc1cPz5nXCs3T6OR73UHiDItNngsdAVEC7E + XhfCS56mf7C0sAH6g8EuAJFMpbpg6oaiyooMgo7fOSDBhZPYCNRHPi3UnFHJztgj6oPhT3ki+JxH + TBgnCb8iTxbmKBgaWahL6+GSdEL9YiRc1OhXMGUbbPQyfxM43xPZKy/nCv8pUESr+j7fOBdzdcy5 + weBgYqrU9fr/T+7GMqO+WiduzBVGr0v9a7kzMozrNXeKOzSqwA1Et6PwanJ3MZzs9noUZ2HMDAuN + 6/IrxeNdkyMpHlHYrcjw6G74cTz1YHTZCvy+B58Et8owpodGQwHpSD4i4fEY+HvkHClkRqoqqA/0 + LeI5S+Ga7GvDE7v4d/P9WPkwo9xxlsEHVIpjvZlCpdBcGJOft9vL5dJ/4NJPIj9i7T2a+oU6HJXI + pDahHVsjB2lqrZSg1DmxEPEb8WqYsactaj8kRIeUPQWOCinUMi0snFRQ3Z3I9iQPMne9bSmcl98U + mdUhpx13H5V6o9ckeYheN/ILro1rmG6ne9LqnLa6wX0wOD85O++dfYYfUiL/FOY8Rf1jo1ZkK+cC + FYuoDX2pkjaqOGZ5O6EKtu/ZrOfSPZL0sIBSkfkx22tNLuby014lbVvdl9b2jHU4NC8wntMxSfVb + fkSQc7iLkAmZKJYv9jjrC66WJG6xoWbxYNPBNKxIwaNapSTDNOJoby7vS3N6PSi5hWYHToA36zud + aY4Yt8cvbmzI1oNFZc9lwwNptauX9oAIyT2+dqLUCG1TFy2/qNBEFipCnwbWMXqVepsBWAO0u32V + T12PcPhIXj8UKbNVdjW6GW8A+b2S2KNnHqHQ9oK6QHB0lrEVPCAUGmMgKgaFMVVtefWOgbJusUKg + KdB1Rkh6CYMixrhhF1NMqIZJ26uuoNw4k3QrNYz6jZIdRQUVGUftwy1ys0AFptq9QYxb7iUVZfTj + 2IPbu+HQo31KISJd68bU2JqGK8u3IkMLoZVgYtWgQiRBOhMxy1O5okYEWrHb06ZkllDM2Bf6SsKE + pKIrnKGs41NOjW5lG5wUuc0C+Z8WsYWpkuPW2BwyVNGCpuyBp9ysHExzboTVtxiwRk61yCObBsgL + lUsLh13QusiqrUugiOorI/MqwgqeldeIJDmChC3ZdeqE6rxIq6kNkxJgm1hl7s7o76b2Bg1zp9v3 + n2JrZry1PLw+T9zEbvTq3l9Ws6OWHU7bszaVRY21l1Ok7kawU982hu7e9aHIMrd2cX0HsxlcX1/D + xPEfXErqPeJD7U5FcNxY84vLRc8SDKmmLVEHZ7SJ/QEVdLd/QB1QImeVWasFre7gsJpJ8RvdXAM3 + w5pTfX2OPTeeG/8BmV+hEywPAAA= headers: Access-Control-Allow-Origin: - '*' CF-Cache-Status: - DYNAMIC CF-RAY: - - 7efe62577bcc011e-GRU + - 887715cf1d1856a9-OSL Connection: - keep-alive Content-Encoding: - - br + - gzip Content-Type: - text/plain;charset=ISO-8859-1 Date: - - Tue, 01 Aug 2023 13:21:25 GMT + - Tue, 21 May 2024 19:48:39 GMT Last-Modified: - - Tue, 01 Aug 2023 13:21:25 GMT + - Tue, 21 May 2024 19:48:38 GMT NEL: - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}' Report-To: - - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=d1lok8SZWJNI1nACRaycX0%2B1YmNtOjflDeTI2QaKJx2Fj2dgrCIzgLl9tG%2B0hQzTS7p43sjGBPgPtyDVLG4Iaw37wW8GyZU5f70NwBVA0dew%2BEQRdM0nNMNpJYOfXx9BJ6U%3D"}],"group":"cf-nel","max_age":604800}' + - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=FloI5Itdy2UvPGtUkGn7GgbB05F0hPG8w0ax%2B8gQK1CXkDCklut%2Br7gea%2BbDyDjLhOYKRJ6cf3RkdO5iMw3b3t0Flovj7PXW9oVk4zG1y0tGXJSlQIPBb3%2BcSJYRJG1BXRI%3D"}],"group":"cf-nel","max_age":604800}' Server: - cloudflare Transfer-Encoding: diff --git a/compliance_checker/tests/cassettes/test_netcdf_content_type.yaml b/compliance_checker/tests/cassettes/test_netcdf_content_type.yaml index 95d1c8a81..1ef82460c 100644 --- a/compliance_checker/tests/cassettes/test_netcdf_content_type.yaml +++ b/compliance_checker/tests/cassettes/test_netcdf_content_type.yaml @@ -9,7 +9,7 @@ interactions: Connection: - keep-alive User-Agent: - - python-requests/2.27.1 + - python-requests/2.32.1 method: HEAD uri: https://gliders.ioos.us/erddap/tabledap/amelia-20180501T0000.ncCF?&time%3E=max(time)-1%20hour response: @@ -27,15 +27,23 @@ interactions: Content-Type: - application/x-netcdf Date: - - Tue, 24 May 2022 11:35:18 GMT + - Tue, 21 May 2024 19:48:37 GMT Last-Modified: - - Tue, 24 May 2022 11:35:18 GMT + - Tue, 21 May 2024 19:48:37 GMT Server: - nginx/1.18.0 + Strict-Transport-Security: + - max-age=0 X-Cache: - EXPIRED + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN erddap-server: - - '2.18' + - '2.23' + vary: + - Origin xdods-server: - dods/3.7 status: @@ -51,181 +59,166 @@ interactions: Connection: - keep-alive User-Agent: - - python-requests/2.27.1 + - python-requests/2.32.1 method: GET uri: https://gliders.ioos.us/erddap/tabledap/amelia-20180501T0000.ncCF?&time%3E=max(time)-1%20hour response: body: string: !!binary | - H4sIAAAAAAAAAO1dCXwT1bpPF0oXllLKvg2oINAlbVkr6pw0FPEBhbaACDRMM9M2kmRCJukCV1sE - FC8qKj4e4oaK133FhatcqAiy3uu7uOBVUbxX3kVRRMAdyfu+WZLJNEkDbdpeaH+d338y853tO//z - ne+cOWcmz5gfpZP+EuHogOhyMjdwZhfvrBGv4/2ODidfZrFy+LsjHDF8qYDnRXB088mbBJfTytml - +FLh6Fxl400W1u86hu8Exzg4ujDmhXa+ysqx5TbO7hLvR8MxtrjCIlAs57DyNXiDEtwOB+90cSxV - WkNdw1kEi708vchi4+0Clc+77SzjsvD2DAzf2czaTPCbMblqHJzOG2e3Ym8+p/tKo9P1QHm5fKZK - xmlhSq2c4As3wWWxcSZ3ZZqVcYnA2xHcaZVpSigLm4ZCKGFxuVkOZcrFMwjfG+NX6UidRLS//tIk - dUlpJ5t5u8tpKXXDHZOdsXGy/A1GiNzKWKhJgGnUtRxjtzPUNW5W4O1p1JQa1sJQBgtnt8KRRl3D - WKoZezk1m0HhIhCm8hkXl0ZNn0QV8oIAEfAVduq/OGcZz7sgPON2MtQ0ZvFixsk3zIeTtyr52Djd - abGbLQ7GSk22V3KCy1LOgEgaNclqYTknNd1ixQiVX07OwTjFWkqjjFA7cIU3c4KgCmH01TdjZ6lC - zsxXcqCVRu+L8U1l7Ew55/T/BflMyuMhe3ZMWVDqNGOm3YIUEWUFzkUZLYIUGVWZlaFPo/IKSKGx - CDA/PStjjE7ilZPDApo4G2Ox+vjR1y4pi7ZBxdq5DKfbBQkLGRzrFmU6KeFUddi5oZp1SYqc22lV - 4qYqXC5Hbmam023meWtGwBQ6QUE4kxiYY+Vwqdn6rHHp+tHpWaOK9eNyR43J1edcj2mIshZBcIui - IWW7T2QEF+e023jBZcJzaHIYJg5tQn3hjj2/Za46jXGWQcpuJ1cst7ZQba1LGe+0QTMCTQtQH14d - Ds102RyZkwsKikxSXZumca48Y76pMjtDn76Icbp4NsNuFuVTyjlecACTGKsJm6SNqdZ580Ub/tLb - 2CVrXiA5i10tt+Xzm6M6dsPya+TcdotLaZudWa7cyXGCyQ7Gp0LXMH2wBX7pq/TSQE6dfn3hzl4H - vr7/J236aFtU6XdS0udA//C7l0oWdOiymOFEzgDa7ihS/8PbQeWkDIhyV/9fWRlg/0ByDl6wuCyV - CldjWb4KA/YJJKtkVpaNsknnieUuwQR84QSfTY91Od0YZ0cw7Urngtd/CsQ/KrOCt3GZCyWzlClY - ebPblgnUsTKlmYLDlclVY3+QaTeLrMk0krzMKqfFxc0QuSKRKB+qc5o5w5aYrc/OxhSyRxVnZeVm - j8nNybqeuhziBNuF5BSGBxbB1idA8ysXoxMyLDwvZLiFTM7Jsowj04VmHE+gYVstTDoWRD9an1Ws - hz+ga17+1UOxX7gsZ+KVUEmX4/nw9KzLsvUVvNspll829mI79IsFlJGVnY19ZEeLvYyf6bMJgxrJ - lWhLLHYBuyKX3Mgw3OhZFme5xQ69w2T5JkfxZWAo0aZQRWboLswclU7NtlghGzZqKN6SXABdN0wD - OlWzyVzBmRcKbpuvzilzTtZo/bicrKzR45hxZk4/dmzpuKyx5uyynCyGHTUey5DiC8/bHFZOslQy - L4olXvQRZZxcOeQZmMVA12C2MEoJJNn4qaSQ5EGF4/lCrqaKd7JyW4l6icycVURdRRHoqOy8jXcL - 1Ew7KKgKTJ6TmsVVWMxQ02nURGBIhbe8V1EFZugUBeUEOyowj068M1sMqVxoNGQxZ3NwTtEWegOr - roUIX8RYoWJcNZlGzg5trwYuQafFus3QDOHnuYWUz84tkHIpjZJYlQYkoYqAJFKo9FLoJVnKAQ0K - LbgYCccookVi6wR0OBmIQeXPUG5fDSjS4i8Am9zvdVfq0VQJDbLUbWV8tqHHpLypRm8R/stX4dgu - rBYz5N/b52yQfEbs1W1MDVXKUU6OBVMjui6QeXQZ3FiKKosL2p8LbuNNs+g4UpLXAA5dJeQShAUK - IkNJys5TYGyQBHCdd1IWILBFFAFWMJgvaEWL3KBA0KTqotN7UXSgeGzAqVM5FyP6pv5Oyfn6JMng - U4CZNTFuKBKYvxo5rhRwDbxuguQ1iPI9pmE/pnTq4g+5V2/Yf3ZWalvjR3eWqlt2yuS6AMVhnSsy - dDHoVu2vQTyUmFwV3pgOagLvDF1ADEVZ7JTSsCkjD+4VNvmuDnep1SJAbn0el+hvyZ1CMH+riy+c - 7HHJfana0RXL55WTPa7wfa5EJ1fGOZGUgjfc9YpdFu2xnWeYjHK+MrPKkY71D0rIdIM6GFbIBAs/ - OjNLnwk+KjAkHXSTPiMvnS9Ll1SajgQw6Ueb9ONNWWMyHGyZmEa8wDFqHzJlqoVNJ9AhAovM4PGX - V0h9bZwAnYvZV+4RBaUC56wULSn0dyLFypy8jRLpDt0fMEBunGKYBCn8TLVOOvt1ltL1HkXQiEJz - yetj9RZc0PwYJysWwL+hY/xxwOnK7NFi2K6CGzLsmqUeiaHMtAbjpLQmjsyAt9CT2Xz2JmaAaEPg - n6FcSFQbuMqgNpG+UNbgFM6gxJCSGsFuWK1ogKQBLNgKIDgGF2SNUQ2rDiPgqHIelAzmBIWVtCFa - F482BPsDKq/YKFoyYwFV4ABPh6PMThjGpUPtWEql8ZVkthiwb2AfXVawP/I9yIi3mck5LaqxVoJH - IOfPe5cVG2EGNdkllUW2ixTDshaZRxU1rJMvdzIO6FclUimRqMsmdecUB7aOQqtbXkGBwyiWogJs - rJ13gZ7gXoC8yhqR8glKEMD1YN3gcKE61MqF+IvdnMBi3zMVLH9WGoU+lKgmpzRGlKSmgg7hvigz - ShLyS6RBtdk5Rqr3nNGUDfLAlzKoWeQFmw6Ww1oGlVUGXT1kDXoIptzNUbOImHAZlAXuCWCWOchw - FXAf5ARsIuCeUHmMvYZXKVip3kqL0wU2gbLxYM6hXfpaaJkVaYKJY4YqOIZFojSIkkJvHTWUM1oP - eUbiMqXY2zFUFcctTMPQdil4KWNeCJWmyaJ/UTC8rMOaDKltdxNbnXgJGoCJs7M+O6EeS2Zl52aP - z83KFseS/mHAGjhdAcNk5eboc7P1GKYDtFirqt9JDeRlY9yzuVDjVO84KwmOibqG81vRUhK6GJ00 - L4Xhkkx5FW77wiLLYsn+xOqkeTCc00owTbSbedZr6zB84uSigvRx40aPT8+S7Iq5TJkqkeynav5H - md/pCK6wMumFMiOJynNCwvN2Tj0FBrXNyEyV5rlEf9kMTaVcKYqcFxYdizKLYs/R5Pm6QlGmq298 - Tk2T70RL5Xu2P+pANRGl6CdW1k9MmDpoSv7iZk8toCYbvb/jIV9Y14k+uy7ei5KPTpKMLtGUD61p - FmN1c948R3k8Z/qgDGPGpmUC96yck+9B3B3ADe3gDlBn2rS09bWsiFvkxpIwVrmZcpTdbSsVDQn2 - hWJD9VUp+JhiH1GJucP6hbHzIjwD8witTuxbIQg0cLjngAYi1TjOdFrV8WT6ONFkHiTKszOKrhMg - cxbWO6Uh6a/W4/Go7snTGN42ESWfA2+exbFeLLZ1Td3g0R18XvDeLXbIKam2COr5othiKYy2jrAt - RpMPt857b9CaOsAF+RMefRPlGYhADhtVLOUnHroODp0M+XpCuRM1YmGUeWdN/Y3DNMES2RxgfZ3g - 3zvABqOlBeMp9b9suoO3SC0PL8iVnBFC50o5Aum6k6JrWSaZ9/lliost1gmUwwzOkTJGjlf8cKUt - qH539vOrVPmQ6yBJtLughHKLdx4gVZ+Vfi2Zlp41fqye0utzxX8dNgL/uZwhAoe9koAMhPEMiqdD - UNHwSoGuF2WxjqDen8VqiFf8LE39d22k/mOmMGK9aNuvZMNXj9PJfwH5ofiZqrGLHz/mSGG7mnkr - 7zQwzqlw0ybNYEh+6qw6JX6fDIyG1TL1Phktj+bPUho0cIVzOnix6pBFXq8JWjh0SzZGmnFBLil6 - UvrzUGQLwbf4KeBJy1MkgTiXrHBuiq9eIsk7df1r+RRoLlVrb7T1obU52rpQuHe7Un6fa3+O/JNm - mc6Lf4qPoZr79ePfdY3xrywM/vlktPwrOS/+KboKj4Dny79uXv75100kOajlgZaH2jn1wBz06Tsw - B333FQ7uwHNpJNqAf53C4Fak7NNuHOGAz+CqSGck/5ulzG7o8OyipxGAHHbO5ZWwgZbcOH6qqpD8 - E/WQzDe7Jzo3nM+38dUjhU6/GA69ERhpqKYEBU587JuGkYMHhNN20OUIFkFkYRbOodlwcMJaKjkh - VL/bGA97Gf3LrzKHF6Q9PCNyUZwOaWYuNs1WtXNRp+ut5aLKXF2AdvG5UcgDeaZOy0Ucs52r334x - cCjUOKK7hj+yaNjcaUNjhudwijlKmrb340VnXRNs1NWHdQ1lNDZqm0/mQuZXktnr8nrn0XtI/QIl - uSqUqmWGsGl5UvGEIJwcoeEkTsOJ84lFHCM/CZ3FWXmz9IQqsnauHycnbsIHJqLiTJWqxLWc7WCj - BHnKKojNu9TLlcA2z3df4fVGvF7Zzuv/dF6P1PBaev4TnNiR5HV/u5J4YGK3BK8/Re75piInQxVW - azmO88MpuP4EH4ObWKgGu99aL+38e1PmL3OK/aZYcdArUciFM63KrCyyW15NwrHigFaer3we5/M7 - OvkqnOgPVI6m5G3YNGkyGBisegIryM8SIU+qlXHJAoPLYvy0Jc5LyOtslfyKfa7YhqV0omQ5zG8P - XfDnFuhnhZr/iLuG8z4/7qmSu94iTPetBvNfD6a1Y+K6sh019XiunSfBe9G45kxen9YduAGBGc1y - WKktiOUzLcLVfn7zKJLrEGJs8jCt8DWofdT5/rwy08H/dLl88/7iihejV8mJyGWn2299chffNZPZ - xYbkcWPjgQ6+pJrFfsQHWb/X1btmAVdHSzrB+0lgTdLBtpcx0qKBYPZHzTutrVHW/WntjMgJ469+ - 9xQb00FVH3AeNQX4PQW5Y1YtfdL5czxZF5rj58xJuiS2nq4ZvkkXmpPvSEtQTeqsmcxW7C2BROXi - UsgyK1NOBZIrwx7JarFzwUXK8Rm+lLPgQvhU3MSXmcwVoeUEh2WhfNvv+iKzpm1o28+Qhm0jRPsJ - 1AcPwF7XN7ntm2VUcafJ7UlZq6YL3J4G+7rmiVboF5xYO37r6STZYG0tXnF1dOfXTw/29c6cN32T - uUH6DfrrIsoWrL+W1vZS4bajF9ZJddig8tVtKfEc25LYNy5tWt13RlaaQMF2i71cVfYNdh5yaHLg - 4iynDRytch5YzcpL8kqhLUIb8V4qZVh5g0cFtCzGyZkcvEt6Egty4sM8s7g21yspOaRyy2Fx2YlJ - XAroPVFPnZsk71VcfwPsqpQ1kCTmXfwlKPpI1EVFx8R2iOsYnxCSsx1nSEsBdUE4O0RdV5Sy9ImS - Q1H5kLIUfxDOpTfKOQpCutyCaBYCc0ys3wT/ewrHFL9IOS/W6V78EsvFSitItdxqdjttrD2x0ViX - fZkutJ1eKdtDOVuhTLQiEtg6K3dD2FxFRGVulUtiYwtuZ++iZFUGt7P06sOKTGvZ2Q4FuFZN5kOg - Zzs+O2v0sSCyY6BuPp6z6jS1tjRuYTkY05yAPJd8kpsD8ly6d2O9fI629CUcmCf61Wy7HW2rdnSA - XE8hTGhQbg1owK1mt5kvL9f5j2/aedQ2edRP1FFwFgW1T1K4ZufNR7rAtlvNn0DP9cS4aqW4klVL - hLESvHY5W5+Vk6kfk5kl2UvtvGGiw21zQJXkFRubxLUUGGCKCyB9S3y9etPmoSnzLp1wcbGyzwLD - 2Bjon208y1m9Mp2h7yq1OFlq0nSlWI30R5wT971J6/t8acWO14/PRlSPH1ThGoyTs/zqdVOaTl4z - 0N6vtGl7kAwJa41AMBuQ6lWxvxloog3YVCfmTZzcVujix5eEdk60KCf6yw8agnUSLc2P97G8StwB - xvvt/GhZfgz0qu3cx/MR4sgrl+vkdUHt/U2b5k4yXAvXnvTwaba5/c5X/iDnr73PaRu86C8/4z7X - PieSHPlf5II3/obj2naOtCxHBvm0dc7j1wjy5FVcTeDbU27jxMGZrmEfFGoMqx2b9pk1eWoR5bch - nSLiNsGmcUv9Xo44xhdhU+dUwxm/dpsu60g9iNWd+xhTu4ev46hx+qzxOaPUdYJVmeQAilsEDl9+ - o62P7rpz8wnC3q8zPO2baNyvc+/NWzCHoeb0+8nz7Vb5Mbo01e4bNKf4h/W+vEusG1XZGn/+2bR1 - 9mMmq7dfqDf4iNv7pM0Vyq5AoGA6zinIee3r46nJ95i+zKl+f0FPt9Oey5ebc81OIXfi9KJJubmj - crLHNInnTdhXJOo1nH1F4T5PTfAW3JdOh9mTisaNkvPadtbYR6+DtrM/CL/U7ael/eY7W7bvC6On - i2xfN1il/1Bz/k3suzYjd312UlrMFnE7WV+4s/fzveak1Rfu2OU5PGia7rzspHewF56d9I0NI7UH - ZKy/nVRvRGvUUP6n2cluXjsZ3v63SNvKVtgDgrZy8+YgHGu3la1hK3l7BG3lm9OxPpW0VO8CUD+n - CmUrg74DYM/4L4/iOwCmDOpzUhfaFkr7jSSSnev+ohG+9wKE5bs1t01p5B0Ckj1p5B0CajvSRvb7 - oB14E/dFdFVzo31dWpueSxiirqvzmMdOFsM16xz21gnIA4f8UkYNd1LOkTvNtWb9Kdn3svFQc7zd - ApSRM+i3ZEx9McCiM+/tYMuBvQIhlqV5ZVTr0rzXlDnc5lpD32prgKf76j8Qb1N8a9NUkk33uyK1 - tj7Ft/bIoc6v1t7GsqViP9bEdfZb79JJ4xk1K9ptcNu0wQOVejoP+zuwIa8aTOw20R5vwz1hw8Lc - H6HlWdL58EzOm9ZvGzaDFBYXGP32PFD+eRBf6hgJjg6dVAApTysoNk2cRabMJMUTjVTRzKLpE/OK - KQMxUlMnFxVNnjZJah8BuNIBqSKX63x5ci7lb9V15FF+/KlHv3JI4/tmvGEiwZ0hgXSH6VOYvldt - FyRvwi17W+IMrqO9NJyNVBrONDb2DMUZrX8oxitnTMunSwPpVMwbJQZXtHoh8incsrclPuH62oB9 - WABHWwkXOU7FBORUQPvulLfrS/m7+Pq3IOVvQ9x6C9f4Dgy9T9MrHzlORQfk1MBAOhXzdWH3eeGU - uy1xqE7n85FC7G1rAR4F7u8GyfpUNs748lZzQdukcMrdovuNNLzBNcEDQm549Mm3tO0ZoNFdAJfz - guRMOOVuRc5sxzXCWlsTxA1qFT9oiEZ/QVyAC5I74Za9NfmDa4b7BN0j7ZNtaXvTR6M7TXd/QfKl - sTK3Jk9w3XBqoDUrGn4EXRN6Hn5KqqwPJb0LeRwerKxNrLe3cR3vwNDPu7zykZirU3x3b9rex1sX - tu0Pp9wt+hxAw4tqFS+CPOhsEV54C3iRzN+GU+7W5AWuk230CbeGFy01bqW0urtI5mjDKXcrcmYH - BXhJGIselDAtzZtLtPq7iOZhG9gb/7JLcbcid1DxfYMvhvHKtvT4o69WbxfBPGtjZW5NnuzW+WyM - IL9SMJw1Cy1tY5S8XUxrGcItexj88UbRzPzZid/JG6jlTyP+bks/1/EW/iLzhUOVuzU549AFsDlt - 6Blzg3Z3Efk14Za9NfmD35jqq+VPi/o2gXnTV6u7i8i3CVbmVuTJO70BUxSe1NhdTHVgfjTn3GqK - og8xvQu77oOVtan1hm+oGyrXm4uzOTiwQTh8aUvP+ofKZVflL5h7dkHW/bmUP4x3hKujae5nLO/U - Y1oB+NRW1gAMDqDLi2UdQLhlb2UO7cJvpFwSgEMBpnBbdZysVkKA6cwLkkPhlr21OYSqDNSvtaV1 - JYHs+sW0tuRcyt/afNqi861rU/OpLawzGRBAjxfDWpNwyt3KvNmN36VQxs+gbtzCB/kxlTOOyI+P - lPGilC4F6VKQ7oVtUxorc1PrU9yvq4yiNXXX7N8gIZ6kCkPMhGd1ofeC3xHGMwUq9Lxxg9sh9nsH - mAbyTkmEsd/bUKfTaWW03yK5ShFps9986q/e7w11J47CVGEi+l1G9bMqOW2TipPqPdwK/6ICcF/k - n4EKyP0Ae7h34zt1kjQ1rbVd7Xu428gebu9M37nv4b48FL+a990ae5EfSaoeWMup5repCXeeIlzO - A7rQNrU+vDkxqtGpjkASwd620chAJZCYygarLzfyPShap/y15XduJBX78yIQz3v47LBGOnLf2+sR - 0HeU7mvfn9Exj7MKFregbg9h29/6Dco52t+916H+GtRyuw1uqzZ4sHpkcR7fh4rYGEXnOwcbvA/f - kaV+f5maT+3v0m5ZzvRtO++92vczlkv+qnkgW9POjRb+1pxcF+djSyLAj/347eRYd/v791ubF73c - 5/7e/WH4vtUqvO7rZCo5K28OsDigqTzZgDypbOdJq/MkhOUIOhYU32MeHlGaypPT0ncP0rP1WeP0 - o8VXeur1vm8IdODhcMCxCA4nHKCgDi50ufFdre8NWlMHOD/vf674A+Kzm2feCFhyevOf1wOaLHPJ - 44gHd/W4Ct/pmj/h0TfxewDGLlnzAHvpXr8pCjD1xi8X/0Qbtnzf/ZNXegF++/I3Gw8DftV/6Pr5 - +B2Bm6M6dqsv3LHnt8xVpwEP1T7+1keA3z6y/I67Ab/7dO3Kk4C/vTY5/536wp3JM2//9gXAXge+ - vv8n5f3bLYW1P+vOC1s6n438dZYPtBlddL59XPHk6R/eJg8/n0ruunIRWf7FNUQ4mEiK4Vou/B48 - cDPteT6V/ltZGb1hxje0+WAiPWjecPLMfesJ/CarAZfBwefkkCkQJrusjPTLyaHPpi6h37/8R/pB - x0baDudjpPdxktf2/5U8uXoeeUinI3fCtZvhGg/xTT22gqQ7NpKOkNZTk56nx0Ocf4Y8PbNiENnw - 2EFy7+ZCsmLS88QF4U2JVxL68h/JMLiXALJf7v8r/eQPb9M1962nx0KYJ0F2HYRZCTJVUJbrIA2U - Hwrl6QDl+QTK8ACEKV09jx4O6dw/cDNZDXHfDGE4OMdy5EDcKVcuok+B7KYVg+jlIK+H+2sXf0EW - py4hxRCfHo4YuL8H8mBzbMR3jtIlvWm6JHUGXdL1brqkyza6JLaeZn67l7bNnU1XDa2nq+9dT1fX - L6OrD82hq79/n67R/RvC3CAd3WdCuO50yVNr6IXznqDtBzbR1Ww/unrLVrr6s/fo6l9eomsSj9A1 - PV+iS9IPw3E7XXLZCrqk76t0Sc+BdEm3Errkwcm0ZV8FzcfV0NVzBtPV20bR1Ycr6ZKhH9AlIwld - MtwlhUl9ly5JhvCZB+kyIYO27l5AVzOFdPWbkN4JPV2TdAdd0/8YXdIvgS65hKVLBn8N6ayCNFbS - pc9m09aCvXSVJ5aufrk3XX3cTNd0qaNrhkGZLzXRJQML6JIh90CaS2luWDltvfoeuurIHrr69Tq6 - +sejdE13mq4Zvgny8YKYJ+bsxyCzha7mCF399mm6+uxOuuayHUub/09nrMuGI+tVY53+Z2Nd5vfG - uvTjxroRe411HeuMtT+OMNaeegKOscbaky/AsRqOiSB/GI51cMRBmAeMdWmDjXVdroAw++H+cJCv - AvwMjvVwXAHHtZAOyGSdhGM5HKMhvY8hrN1YN/JrY12KCcLajbXfj4LjdTgelWXvg8MIB+RRXwHy - L0D+4o11A+8y1sVXgtwDEPd1cCyBIwl+W0HWAbIn4FgB8kdAfo+xblgCyO8CmT4g85KUx5MUnI8B - OSiLfjUcMSALYQfNM9YlvGisPQ15OVkkxll7cgIcd4PMKxAna6wb/i3IfG6sPfEU3P8ajtfg/ItI - 1E8k4qxt/r+I5LM9zrYfZyS4hH7TKQrsM/hRUfwP6YhdXz+UijjAs28T4ogrr9uGOG753c8h5u/7 - 5xOIRQlxwxCZwp4PI/L3f7cEcck/Xj2FuHJkZrLyvSZMJ2nl3b8gJvyyE/20XvEjHVcgxs0/sAMx - 9sCYFYgxsU+vQ4wam1wH2NPzzLQZiL8feut1xDPJIwoRfzVsm4T4s7B8MeKP/xd3H/p/xkMzP0Qs - SHs/DnFO9Zd/QzTvWFOMaE+O74tYPW8tljN16ajC3oirbl3aD/FeJxWL+ND2/HrEpzr/xY64ac7S - NPQre6w69AcRr9lzuYgdDj6GmLrfVS7ibXWHRcy/ZaeInS/7UPRH35v2noh3zX1axKlzZouYyP0L - MWVXNSPiHZ98IGJx3yj0X39b+9I0xOO/D/oG8Z+WtVmIHxwZieG+3cPcvAlxy6FFhaK/e8mZWMTH - H3lIh3jfoEuOId7+wKjdiEsPDC5BdF/5cSL6xW+/mPYl4uNlUbmIN+v/dRyx5FfLXYhXvHPDdsQB - 61adBjz6K/vjcsSD+gWZiJuOD5iO+N9XvPoEYuW7WA9bPv/nqEHrEd95at8BxGeGDKhBXHPrfZje - 59W6glOI86omYjk+p4+NGKx85ysS7Uf5Jg7g7jlrt/dB3NTv8ywcC3R6ZGgF4py5n09BfPnTTfcA - 7u1UMlDEOT3JJ4gvP/rI74D7OuV8TRCvO5HUG/FPwx4/iHhqxdydgJ/cf8ayDvGLjbUwdtjxaTY3 - bTLisrjedsTdg26djWOP3n8hGP6QZb6rHPH5G5d9jejpN/cw4GcFb/a8HXFDUUoS4vcTuowE/HzM - Uw/GAR5bvPeWIYifzVvyPeA35K/X3YL4eG7dWBzTxD++OBvR2q/rbsS36oxbAY9fNvqzjxGXzKhK - Rvzsq9134tjHUPz+CcTHt+9ZibjiT6NwjPTdmkv3YX6+2/BA6VDEZ4d9VI/454c/vA5xV5+h+xEP - bBwWhfhZ/tEUxGNbD2xD/GX83iWAJ+Je2pGHmHr5qh8QB237I+bvxMiS+KmAv444evVcRL5q8OuI - m46M2oX4s+7sGzgmm9D7uaOIddlrPIhv3NFnL+LZB7eeATxjeP7MMcRbtr+O6Z55q+rJfwP+3uGr - t9fDGK4bvSRlC2LPqK0WHNt9+VjnDYibDMJcxKVHimcgzl7zwhDEoWMvgXrd2fX0P/TTEd+uSL4U - cd28e+IQbS9/lAvY88gd316PY8ThSw9+iWjjc08jPvHs4iTEY+uOzMNvM2Xe9qiIwtLvf1O+1RQJ - rqu+fTJv728T70fc/+bzgxD/9odelYjvnrHziH/f8tat4vj7xl7/g/j+78wqxA//cnwJ4kc3rfkF - 8R9nT8YjfrL0jbsQD3Ugx3GcPv7uS6oQr0hdi9fnT/hgO8Y3/6q1E5Yh0j3XYrrzyYdnf5bG9+6b - ECf2Oh2LmP/R/FsQr1n39zWI187pKyBO6XfZYcSpDxYtRXyscG0K4uPd78Pyzf/T+3EbEJ+817wI - 8eni124T5w16jLciPrd2OoP4wuxTZxBf/JTgPML8lx9kEhFfmf+KmO/XBqainkq++v7XrxCPbZqI - +Sn5VvjTD4jHT3cU5yFOvFJpRzzp7rYA8dQPpf+N+EP13hrEn8aPOYn486/xqJeSX9+owvRLzize - OgDx9zMPuRA9tdWIJtOp90RkXmdFNC8eYEHkcjevQCz7bZwDseLNXXGIN0wYLMotPCN0Q7Rt2Y35 - N/E3ZqCeTQ7Pp8sRndtfRP2Y3q3Nwfyb/q77/Z+IB966QYz3/aVHUW+mDw3534jzKdufdCL+Y1lU - NeIneeViPIdil2D5TJ+tcvdBPNzlx5U470JfPxLTW2Dou+EOxLyPv16IOHGuEeNfMKnfSgrxmk+O - Yn0tuPaBxQOVb/BEhOvtcwjNNocQifpJaP6/iMQZ1fx/Ypwx8Oe94vfD/2eQc++pfIKLRb1/0cF+ - +N0Idkc5jY5Y2Rv/i/bPaThxavSk0mfMhazPSHA+EnFGouyRiPM/pd7DEzuvduS9EKIdae+oZPzO - AuozRv1Dex5anzGtq89IxHkeddS8fxd1f4Tr8A0x4xcaYoYvN8R0PmqIfneTIfrIcuJ5Op54psFR - vY54Vkwkntu+IR4YY3geSjDEjOthiBm93hCTVmCIiakxRD9RZNBxzxl0Ka8ST9ojxHMTTzxLS4jn - rhHEc+/1xPNIHchvgmOfISZzoiFmxDhDzDC3IfpspiH6oW0G3ebuBl3XQuLp+RrxLIDwN2YbYnLG - GmL0hyCNK0CeGGIGxhhiOukM0Vv+bYj6/D3i2V9MPJd+RTylfYjnFhPx3BFFPLeeMMSMtBliLrvJ - EDO41hDTfYYh+v13DNHLqonnraeIpy+UYerLxFM7n3jWvALhJoDcUUPMgB9A9itD9K6Nhqi/2ojn - xBAo+3TimUeIh00jnnv+TTwvzjXEDLoUynubIXoP3DsLukm6gXhMscRTt414lg2NhJ8orutNuPcF - kvDuMyRx0kSSlLuG9Oz6C8n7qoYs6P8sMb+wmbCdlxO2eC9hF75B2FVGkvBYB5Lw4h9Jwt8cJNF9 - J+m85T1yxTMPk/wjC4j5syjCJu8j7A21hL03n7Bbogm7tYokfLmaJBzZQxKO7ycJR58gCeC7J67p - RDpvu4aM3v0KmXTLdmL+8XfCsm8Ttm4USTiUSRJ+KiOJCTFwWEliykGSOPtq0il+PRk27E1Czu4k - 5mP9CVtYTNi7dYR910A4yGfCFy+RxJ4nSOLll5LEotUkaYqe9HlpB6F3diClp6ZCGWYQ9sGXCbvr - X4TLXAZyd5DEkQtJIneWJG09TC55D/z+4SZSCvfYmfcTFvx69oP/FeNPHH8dSXznSdIT9EUnfEDY - UXbCCscIu+c7XBsdifppj7N54/x/TQ/PWUjNAAA= + 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 + nSTsnm9wj1hb9E97nq2b5/8DW8SJJxyTAAA= headers: Access-Control-Allow-Origin: - '*' @@ -238,17 +231,25 @@ interactions: Content-Type: - application/x-netcdf Date: - - Tue, 24 May 2022 11:35:19 GMT + - Tue, 21 May 2024 19:48:37 GMT Last-Modified: - - Tue, 24 May 2022 11:35:18 GMT + - Tue, 21 May 2024 19:48:37 GMT Server: - nginx/1.18.0 + Strict-Transport-Security: + - max-age=0 Transfer-Encoding: - chunked X-Cache: - HIT + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN erddap-server: - - '2.18' + - '2.23' + vary: + - Origin xdods-server: - dods/3.7 status: diff --git a/compliance_checker/tests/conftest.py b/compliance_checker/tests/conftest.py index d78fcbb1c..a320df71c 100644 --- a/compliance_checker/tests/conftest.py +++ b/compliance_checker/tests/conftest.py @@ -9,6 +9,8 @@ from compliance_checker.cf import util from compliance_checker.suite import CheckSuite +datadir = files("compliance_checker").joinpath("tests/data").resolve() + def glob_down(pth, suffix, lvls): """globs down up to (lvls: int) levels of subfolders\n diff --git a/compliance_checker/tests/data/trajectory.zarr/.zattrs b/compliance_checker/tests/data/trajectory.zarr/.zattrs new file mode 100644 index 000000000..9e26dfeeb --- /dev/null +++ b/compliance_checker/tests/data/trajectory.zarr/.zattrs @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/compliance_checker/tests/data/trajectory.zarr/.zgroup b/compliance_checker/tests/data/trajectory.zarr/.zgroup new file mode 100644 index 000000000..3b7daf227 --- /dev/null +++ b/compliance_checker/tests/data/trajectory.zarr/.zgroup @@ -0,0 +1,3 @@ +{ + "zarr_format": 2 +} \ No newline at end of file diff --git a/compliance_checker/tests/data/trajectory.zarr/.zmetadata b/compliance_checker/tests/data/trajectory.zarr/.zmetadata new file mode 100644 index 000000000..129505f92 --- /dev/null +++ b/compliance_checker/tests/data/trajectory.zarr/.zmetadata @@ -0,0 +1,169 @@ +{ + "metadata": { + ".zattrs": {}, + ".zgroup": { + "zarr_format": 2 + }, + "lat/.zarray": { + "chunks": [ + 2, + 3 + ], + "compressor": { + "blocksize": 0, + "clevel": 5, + "cname": "lz4", + "id": "blosc", + "shuffle": 1 + }, + "dtype": "