.checkignore .codeclimate.yml .codecov.yml .coveragerc .gitattributes .github/CODEOWNERS .github/ISSUE_TEMPLATE/bug_report.md .github/ISSUE_TEMPLATE/config.yml .github/ISSUE_TEMPLATE/documentation.md .github/ISSUE_TEMPLATE/feature_request.md .github/dependabot.yml .github/pull_request_template.md .github/workflows/assign-milestone.yml .github/workflows/code-analysis.yml .github/workflows/docs-conda.yml .github/workflows/docs.yml .github/workflows/draft-release.yml .github/workflows/linting.yml .github/workflows/release.yml .github/workflows/tests-conda.yml .github/workflows/tests-pypi.yml .gitignore .mailmap .prospector.yaml .stickler.yml AUTHORS.txt CLA.md CONTRIBUTING.md LICENSE MANIFEST.in README README.rst SUPPORT.md TODO.md ci/Minimum ci/Prerelease ci/doc_requirements.txt ci/extra_requirements.txt ci/gen_versions_json.py ci/linting_requirements.txt ci/requirements.txt ci/test_requirements.txt docs/CONTRIBUTING.md docs/Makefile docs/_static/siphon_150x150.png docs/_static/siphon_150x150_white_bg.png docs/_static/tds-logo.png docs/_static/theme_override.css docs/_templates/breadcrumbs.html docs/_templates/footer.html docs/api/catalog.rst docs/api/http_util.rst docs/api/index.rst docs/api/metadata.rst docs/api/ncss.rst docs/api/ncssdataset.rst docs/api/radarserver.rst docs/api/simplewebservice.rst docs/citing.rst docs/conf.py docs/developerguide.rst docs/index.rst docs/installguide.rst docs/make.bat docs/requirements.txt environment.yml examples/Basic_Usage.py examples/README.txt examples/Radar_Server_Level_3.py examples/acis/Basic_Overview.py examples/acis/Mapping_Example.py examples/acis/readme.txt examples/ncss/NCSS_Cartopy_Example.py examples/ncss/NCSS_Example.py examples/ncss/NCSS_Timeseries_Examples.py examples/ncss/README.txt examples/ndbc/README.txt examples/ndbc/buoy_met_request.py examples/ndbc/buoy_type_request.py examples/ndbc/latest_request.py examples/upperair/IGRA2_Request.py examples/upperair/README.txt examples/upperair/Wyoming_Request.py setup.cfg setup.py src/siphon/__init__.py src/siphon/_tools.py src/siphon/_version.py src/siphon/catalog.py src/siphon/cdmr/__init__.py src/siphon/cdmr/cdmremote.py src/siphon/cdmr/cdmremotefeature.py src/siphon/cdmr/cdmrfeature_pb2.py src/siphon/cdmr/coveragedataset.py src/siphon/cdmr/dataset.py src/siphon/cdmr/ncStream_pb2.py src/siphon/cdmr/ncstream.py src/siphon/cdmr/resources.md src/siphon/cdmr/xarray_support.py src/siphon/http_util.py src/siphon/metadata.py src/siphon/ncss.py src/siphon/ncss_dataset.py src/siphon/radarserver.py src/siphon/simplewebservice/__init__.py src/siphon/simplewebservice/acis.py src/siphon/simplewebservice/iastate.py src/siphon/simplewebservice/igra2.py src/siphon/simplewebservice/ndbc.py src/siphon/simplewebservice/wyoming.py src/siphon/testing.py talks/AMS-2016_Siphon_Poster_Final.pdf tests/cdmr/fixtures/cdmr_capabilities tests/cdmr/fixtures/cdmr_cdl tests/cdmr/fixtures/cdmr_enable_compression tests/cdmr/fixtures/cdmr_ncml tests/cdmr/fixtures/cdmrf_coords tests/cdmr/fixtures/cdmrf_data tests/cdmr/fixtures/cdmrf_feature_type tests/cdmr/fixtures/cdmrf_header tests/cdmr/fixtures/hrrr_cdmremotefeature tests/cdmr/fixtures/latest_rap_catalog tests/cdmr/fixtures/latest_rap_ncstream_header tests/cdmr/fixtures/nc4_chararray tests/cdmr/fixtures/nc4_compound_ref tests/cdmr/fixtures/nc4_compound_ref_deflate tests/cdmr/fixtures/nc4_enum tests/cdmr/fixtures/nc4_groups tests/cdmr/fixtures/nc4_nested_structure_scalar tests/cdmr/fixtures/nc4_opaque tests/cdmr/fixtures/nc4_strings tests/cdmr/fixtures/nc4_unsigned tests/cdmr/fixtures/nc4_vlen tests/cdmr/fixtures/rap_compressed tests/cdmr/fixtures/rap_ncstream_all_indices tests/cdmr/fixtures/rap_ncstream_decimation tests/cdmr/fixtures/rap_ncstream_ellipsis_middle tests/cdmr/fixtures/rap_ncstream_first_index tests/cdmr/fixtures/rap_ncstream_header tests/cdmr/fixtures/rap_ncstream_last_index tests/cdmr/fixtures/rap_ncstream_negative_index tests/cdmr/fixtures/rap_ncstream_negative_slice tests/cdmr/fixtures/rap_ncstream_slice_beyond_end tests/cdmr/fixtures/rap_ncstream_slice_to_end tests/cdmr/fixtures/rap_ncstream_slices tests/cdmr/fixtures/tds5_basic tests/cdmr/fixtures/tds5_compound_ref tests/cdmr/fixtures/tds5_empty_att tests/cdmr/fixtures/tds5_nested_structure_scalar tests/cdmr/fixtures/tds5_opaque tests/cdmr/fixtures/tds5_strings tests/cdmr/fixtures/tds5_unsigned tests/cdmr/fixtures/tds5_vlen tests/cdmr/fixtures/tds5_vlen_slicing tests/cdmr/test_cdmremote.py tests/cdmr/test_cdmremotefeature.py tests/cdmr/test_coveragedataset.py tests/cdmr/test_dataset.py tests/cdmr/test_ncstream.py tests/cdmr/test_xarray.py tests/fixtures/GFS_Global_0p5_Grid_Dataset_xml tests/fixtures/GFS_TDS5 tests/fixtures/Surface_Synoptic_Station_Dataset_xml tests/fixtures/acis_general tests/fixtures/acis_griddata tests/fixtures/acis_multistndata tests/fixtures/acis_request tests/fixtures/acis_stndata tests/fixtures/cat_access_elements tests/fixtures/cat_non_standard_context_path tests/fixtures/cat_only_http tests/fixtures/cat_to_cdmr tests/fixtures/cat_to_open tests/fixtures/cat_to_opendap tests/fixtures/cat_to_subset tests/fixtures/follow_cat tests/fixtures/fronts_cat_open tests/fixtures/gfs-error-no-header tests/fixtures/gfs-metadata-map tests/fixtures/gfs-metadata-map-bad tests/fixtures/html_then_xml_catalog tests/fixtures/iastate_all_data_all_levels tests/fixtures/iastate_all_data_single_pressure tests/fixtures/iastate_high_alt_sounding tests/fixtures/iastate_no_data tests/fixtures/iastate_no_future_data tests/fixtures/iastate_no_future_data_with_pressure tests/fixtures/iastate_sounding tests/fixtures/iastate_sounding_with_nans tests/fixtures/igra2_derived tests/fixtures/igra2_nodata tests/fixtures/igra2_sounding tests/fixtures/latest_rap_catalog tests/fixtures/latest_resolver_on_latest_dataset tests/fixtures/ncei_cat_to_subset tests/fixtures/ncei_embedded_metadata tests/fixtures/ncss_gfs_csv_point tests/fixtures/ncss_gfs_netcdf4_point tests/fixtures/ncss_gfs_netcdf_point tests/fixtures/ncss_gfs_vertical_level tests/fixtures/ncss_gfs_xml_point tests/fixtures/ncss_test_metadata tests/fixtures/ndbc_buoy_data_types tests/fixtures/ndbc_latest tests/fixtures/ndbc_realtime_cwind tests/fixtures/ndbc_realtime_dart tests/fixtures/ndbc_realtime_drift tests/fixtures/ndbc_realtime_ocean tests/fixtures/ndbc_realtime_rain tests/fixtures/ndbc_realtime_spec tests/fixtures/ndbc_realtime_srad tests/fixtures/ndbc_realtime_supl tests/fixtures/ndbc_realtime_txt tests/fixtures/nhc_database tests/fixtures/nhc_no_data tests/fixtures/nhc_storm_archive tests/fixtures/nhc_storm_current_year tests/fixtures/point_dataset_cat tests/fixtures/point_feature_dataset_xml tests/fixtures/radar_dataset_cat tests/fixtures/radarserver_ds_denied tests/fixtures/radarserver_toplevel_denied tests/fixtures/rsmas_ramadda tests/fixtures/rsmas_ramadda_datasets tests/fixtures/spc_hail_after_2011_archive tests/fixtures/spc_hail_archive tests/fixtures/spc_hail_future tests/fixtures/spc_torn_after_2011_archive tests/fixtures/spc_torn_archive tests/fixtures/spc_torn_future tests/fixtures/spc_wind_after_2011_archive tests/fixtures/spc_wind_archive tests/fixtures/spc_wind_future tests/fixtures/tds50_catalogref_follow tests/fixtures/thredds-test-default-5-0 tests/fixtures/thredds-test-latest-gfs-0p5 tests/fixtures/thredds-test-toplevel-catalog tests/fixtures/thredds_radarserver_level2_single tests/fixtures/thredds_radarserver_level3_bad tests/fixtures/thredds_radarserver_level3_catalog tests/fixtures/thredds_radarserver_level3_good tests/fixtures/thredds_radarserver_level3_metadata tests/fixtures/thredds_radarserver_metadata tests/fixtures/thredds_radarserver_toplevel tests/fixtures/top_level_20km_rap_catalog tests/fixtures/top_level_cat tests/fixtures/top_thredds_catalog tests/fixtures/wyoming_high_alt_sounding tests/fixtures/wyoming_no_data tests/fixtures/wyoming_sounding tests/fixtures/wyoming_sounding_no_station tests/test_acis.py tests/test_catalog.py tests/test_catalog_access.py tests/test_http_util.py tests/test_iastate.py tests/test_igra2.py tests/test_metadata.py tests/test_ncss.py tests/test_ncss_dataset.py tests/test_ndbc.py tests/test_radarsever.py tests/test_wyoming.py <<<<<< network # path=coverage.xml D:\a\siphon\siphon\tests <<<<<< EOF # path=tests/cdmr/test_coveragedataset.py # Copyright (c) 2016 Siphon Contributors. # Distributed under the terms of the BSD 3-Clause License. # SPDX-License-Identifier: BSD-3-Clause """Test Coverage Dataset.""" import pytest from siphon.cdmr.coveragedataset import CoverageDataset from siphon.testing import get_recorder recorder = get_recorder(__file__) @pytest.mark.filterwarnings('ignore: CoverageDataset') @recorder.use_cassette('hrrr_cdmremotefeature') def test_simple_cdmremotefeature(): """Smoke test for CDMRemoteFeature.""" cd = CoverageDataset('http://localhost:8080/thredds/cdmrfeature/grid/' 'test/HRRR_CONUS_2p5km_20160309_1600.grib2') assert cd.grids @pytest.mark.filterwarnings('ignore: CoverageDataset') @recorder.use_cassette('hrrr_cdmremotefeature') def test_simple_cdmremotefeature_str(): """Smoke test for converting CoverageDataset to str.""" cd = CoverageDataset('http://localhost:8080/thredds/cdmrfeature/grid/' 'test/HRRR_CONUS_2p5km_20160309_1600.grib2') assert str(cd) <<<<<< EOF # path=src/siphon/cdmr/coveragedataset.py # Copyright (c) 2016 Siphon Contributors. # Distributed under the terms of the BSD 3-Clause License. # SPDX-License-Identifier: BSD-3-Clause """Provide access to a TDS Coverage Dataset.""" from collections import OrderedDict import logging import warnings from .cdmremotefeature import CDMRemoteFeature from .dataset import AttributeContainer logging.basicConfig(level=logging.WARNING) log = logging.getLogger(__name__) def reindent_lines(new_leader, source): """Re-indent string lines.""" return new_leader + ('\n' + new_leader).join(source.split('\n')) class CoverageDataset(AttributeContainer): """Wrap dataset access using CDMRemoteFeature and Coverages. This is still experimental. """ def __init__(self, url): """Initialize CoverageDataset from a url pointing to CDMRemoteFeature endpoint.""" super().__init__() warnings.warn('CoverageDataset is in early development, unsupported, and API may ' 'change at any time.') self.cdmrf = CDMRemoteFeature(url) self.name = 'Unnamed' self.lon_lat_domain = None self.proj_domain = None self.date_range = None self.type = None self.axes = OrderedDict() self.coord_systems = OrderedDict() self.grids = OrderedDict() self.transforms = OrderedDict() self._read_header() def _read_header(self): """Get the needed header information to initialize dataset.""" self._header = self.cdmrf.fetch_header() self.load_from_stream(self._header) def load_from_stream(self, header): """Populate the CoverageDataset from the protobuf information.""" self._unpack_attrs(header.atts) self.name = header.name self.lon_lat_domain = header.latlonRect self.proj_domain = header.projRect self.date_range = header.dateRange self.type = header.coverageType for sys in header.coordSys: self.coord_systems[sys.name] = sys for trans in header.coordTransforms: self.transforms[trans.name] = trans for ax in header.coordAxes: self.axes[ax.name] = ax for cov in header.grids: self.grids[cov.name] = cov def __str__(self): """Create a string representation of CoverageDataset.""" print_groups = [] if self.name: print_groups.append(self.name + ' (' + str(self.type) + ')') print_groups.append(f'Lon/Lat Domain: {self.lon_lat_domain}') print_groups.append(f'Projected Domain: {self.proj_domain}') print_groups.append(f'Date Range: {self.date_range}') indent = ' ' * 4 if self.axes: print_groups.append('Axes:') for ax in self.axes.values(): print_groups.append(reindent_lines(indent, str(ax))) if self.coord_systems: print_groups.append('Coordinate Systems:') for sys in self.coord_systems.values(): print_groups.append(reindent_lines(indent, str(sys))) if self.transforms: print_groups.append('Coordinate Transforms:') for trans in self.transforms.values(): print_groups.append(reindent_lines(indent, str(trans))) if self.grids: print_groups.append('Grids:') for grid in self.grids.values(): print_groups.append(reindent_lines(indent, str(grid))) if self.ncattrs(): print_groups.append('Attributes:') for att in self.ncattrs(): print_groups.append(f'{indent}{att}: {getattr(self, att)}') return '\n'.join(print_groups) <<<<<< EOF # path=tests/cdmr/__pycache__/test_coveragedataset.cpython-38-pytest-6.2.5.pyc U e�a(�@s�dZddlZddlmmZddlZddlm Z ddl m Z e e �Z ej�d�e �d�dd���Zej�d�e �d�d d ���ZdS) zTest Coverage Dataset.�N)�CoverageDataset)� get_recorderzignore: CoverageDatasetZhrrr_cdmremotefeaturecCs\td�}|j}|sTddt��ks*t�|�r4t�|�ndt�|�d�}tt�|���d}dS)z Smoke test for CDMRemoteFeature.�Xhttp://localhost:8080/thredds/cdmrfeature/grid/test/HRRR_CONUS_2p5km_20160309_1600.grib2z)assert %(py2)s {%(py2)s = %(py0)s.grids }�cd)�py0�py2N) r�grids� @py_builtins�locals� @pytest_ar�_should_repr_global_name� _saferepr�AssertionError�_format_explanation)r� @py_assert1� @py_format3�r�5D:\a\siphon\siphon\tests\cdmr\test_coveragedataset.py�test_simple_cdmremotefeatures 4rcCs�td�}t|�}|sxddt��ks,t�t�r6t�t�nddt��ksNt�|�rXt�|�ndt�|�d�}tt�|���d}dS)z1Smoke test for converting CoverageDataset to str.rz,assert %(py3)s {%(py3)s = %(py0)s(%(py1)s) }�strr)r�py1�py3N) rrr r r r r rr)r� @py_assert2� @py_format4rrr� test_simple_cdmremotefeature_strs Vr)�__doc__�builtinsr �_pytest.assertion.rewrite� assertion�rewriter �pytestZsiphon.cdmr.coveragedatasetr�siphon.testingr�__file__�recorder�mark�filterwarnings� use_cassetterrrrrr�s     <<<<<< EOF # path=build/lib/siphon/cdmr/coveragedataset.py # Copyright (c) 2016 Siphon Contributors. # Distributed under the terms of the BSD 3-Clause License. # SPDX-License-Identifier: BSD-3-Clause """Provide access to a TDS Coverage Dataset.""" from collections import OrderedDict import logging import warnings from .cdmremotefeature import CDMRemoteFeature from .dataset import AttributeContainer logging.basicConfig(level=logging.WARNING) log = logging.getLogger(__name__) def reindent_lines(new_leader, source): """Re-indent string lines.""" return new_leader + ('\n' + new_leader).join(source.split('\n')) class CoverageDataset(AttributeContainer): """Wrap dataset access using CDMRemoteFeature and Coverages. This is still experimental. """ def __init__(self, url): """Initialize CoverageDataset from a url pointing to CDMRemoteFeature endpoint.""" super().__init__() warnings.warn('CoverageDataset is in early development, unsupported, and API may ' 'change at any time.') self.cdmrf = CDMRemoteFeature(url) self.name = 'Unnamed' self.lon_lat_domain = None self.proj_domain = None self.date_range = None self.type = None self.axes = OrderedDict() self.coord_systems = OrderedDict() self.grids = OrderedDict() self.transforms = OrderedDict() self._read_header() def _read_header(self): """Get the needed header information to initialize dataset.""" self._header = self.cdmrf.fetch_header() self.load_from_stream(self._header) def load_from_stream(self, header): """Populate the CoverageDataset from the protobuf information.""" self._unpack_attrs(header.atts) self.name = header.name self.lon_lat_domain = header.latlonRect self.proj_domain = header.projRect self.date_range = header.dateRange self.type = header.coverageType for sys in header.coordSys: self.coord_systems[sys.name] = sys for trans in header.coordTransforms: self.transforms[trans.name] = trans for ax in header.coordAxes: self.axes[ax.name] = ax for cov in header.grids: self.grids[cov.name] = cov def __str__(self): """Create a string representation of CoverageDataset.""" print_groups = [] if self.name: print_groups.append(self.name + ' (' + str(self.type) + ')') print_groups.append(f'Lon/Lat Domain: {self.lon_lat_domain}') print_groups.append(f'Projected Domain: {self.proj_domain}') print_groups.append(f'Date Range: {self.date_range}') indent = ' ' * 4 if self.axes: print_groups.append('Axes:') for ax in self.axes.values(): print_groups.append(reindent_lines(indent, str(ax))) if self.coord_systems: print_groups.append('Coordinate Systems:') for sys in self.coord_systems.values(): print_groups.append(reindent_lines(indent, str(sys))) if self.transforms: print_groups.append('Coordinate Transforms:') for trans in self.transforms.values(): print_groups.append(reindent_lines(indent, str(trans))) if self.grids: print_groups.append('Grids:') for grid in self.grids.values(): print_groups.append(reindent_lines(indent, str(grid))) if self.ncattrs(): print_groups.append('Attributes:') for att in self.ncattrs(): print_groups.append(f'{indent}{att}: {getattr(self, att)}') return '\n'.join(print_groups) <<<<<< EOF