oceanarray 0.3.0__tar.gz → 0.5.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- oceanarray-0.5.0/.gitattributes +8 -0
- oceanarray-0.5.0/.github/PULL_REQUEST_TEMPLATE.md +29 -0
- oceanarray-0.5.0/.github/dependabot.yml +18 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/.github/workflows/docs.yml +5 -6
- {oceanarray-0.3.0 → oceanarray-0.5.0}/.github/workflows/docs_deploy.yml +5 -6
- {oceanarray-0.3.0 → oceanarray-0.5.0}/.github/workflows/pypi.yml +3 -3
- oceanarray-0.5.0/.github/workflows/tests.yml +88 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/.gitignore +7 -2
- oceanarray-0.5.0/CHANGELOG.md +185 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/CITATION.cff +3 -2
- {oceanarray-0.3.0 → oceanarray-0.5.0}/CONTRIBUTING.md +50 -8
- {oceanarray-0.3.0/oceanarray.egg-info → oceanarray-0.5.0}/PKG-INFO +30 -11
- {oceanarray-0.3.0 → oceanarray-0.5.0}/README.md +7 -5
- oceanarray-0.5.0/VENDORED.txt +9 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/Makefile +11 -1
- oceanarray-0.5.0/docs/environment.yml +12 -0
- oceanarray-0.5.0/docs/source/_static/demo/dune2/dune2_1_2026_grid_report.html +939 -0
- oceanarray-0.5.0/docs/source/_static/demo/dune2/dune2_1_2026_report.html +9281 -0
- oceanarray-0.5.0/docs/source/_static/demo/dune2/dune2_1_2026_stack_report.html +1549 -0
- oceanarray-0.5.0/docs/source/_static/demo/dune2/instrument/dune2_1_2026_2941_report.html +1377 -0
- oceanarray-0.5.0/docs/source/_static/demo/dune2/instrument/dune2_1_2026_9920_report.html +2138 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/calibration_dips.rst +1 -1
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/cli_reference.rst +107 -158
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/clock_offset.rst +2 -2
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/directory_structure.rst +1 -1
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/index.rst +2 -2
- oceanarray-0.5.0/docs/source/installation.rst +104 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/legacy.rst +1 -3
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/methods/acquisition.rst +2 -2
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/methods/auto_qc.rst +1 -1
- oceanarray-0.5.0/docs/source/methods/calibration.rst +236 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/methods/concatenation.rst +1 -1
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/methods/standardisation.rst +6 -6
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/methods/time_gridding.rst +2 -2
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/methods/vertical_gridding.rst +3 -3
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/migration.rst +26 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/oceanarray.rst +13 -7
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/oceanarray_format.rst +4 -4
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/processing_framework.rst +24 -21
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/project_structure.md +12 -13
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/quickstart.rst +9 -13
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/reports.rst +65 -17
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/roadmap.rst +48 -23
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/style_guide.md +1 -1
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/troubleshooting.rst +8 -20
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/yaml_configuration.rst +1 -2
- oceanarray-0.5.0/notebooks/demo_mooring.ipynb +363 -0
- oceanarray-0.5.0/notebooks/legacy/README.md +21 -0
- {oceanarray-0.3.0/notebooks → oceanarray-0.5.0/notebooks/legacy}/demo_instrument.ipynb +2 -6
- oceanarray-0.5.0/oceanarray/__init__.py +41 -0
- oceanarray-0.5.0/oceanarray/_version.py +1 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/analysis/clock.py +11 -12
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/analysis/hydrographic.py +7 -5
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/analysis/science.py +15 -15
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/analysis/spectral.py +11 -11
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/analysis/temporal.py +2 -2
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/cli.py +359 -459
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/config/parameters.py +262 -40
- oceanarray-0.5.0/oceanarray/config/report.mplstyle +26 -0
- oceanarray-0.5.0/oceanarray/config/report_tokens.py +243 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/config/validation.py +185 -31
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/inspect.py +7 -7
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/logger.py +2 -2
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/paths.py +88 -4
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/plotters/__init__.py +50 -56
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/plotters/_cli_legacy.py +5 -5
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/plotters/animation.py +5 -5
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/plotters/current.py +294 -179
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/plotters/diagnostic.py +321 -169
- oceanarray-0.5.0/oceanarray/plotters/helpers.py +390 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/plotters/hydrography.py +56 -97
- oceanarray-0.5.0/oceanarray/plotters/primitives.py +727 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/plotters/spectrum.py +184 -81
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/plotters/timeseries.py +161 -55
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/plotters/ts.py +217 -76
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/processors/__init__.py +48 -10
- oceanarray-0.5.0/oceanarray/processors/caldip.py +311 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/processors/coordinate.py +54 -43
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/processors/grid.py +94 -111
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/processors/helpers.py +29 -17
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/processors/pressure.py +16 -12
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/processors/qc.py +70 -66
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/processors/stack.py +91 -39
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/processors/stage1.py +116 -129
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/processors/stage2.py +40 -66
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/processors/stage3.py +109 -49
- oceanarray-0.5.0/oceanarray/processors/units.py +263 -0
- oceanarray-0.5.0/oceanarray/reports/__init__.py +6 -0
- {oceanarray-0.3.0/oceanarray/report → oceanarray-0.5.0/oceanarray/reports}/_array.py +33 -213
- oceanarray-0.5.0/oceanarray/reports/_css.py +320 -0
- oceanarray-0.5.0/oceanarray/reports/_encode.py +145 -0
- oceanarray-0.5.0/oceanarray/reports/_env.py +126 -0
- oceanarray-0.5.0/oceanarray/reports/_figdebug.py +142 -0
- oceanarray-0.5.0/oceanarray/reports/_grid.py +659 -0
- {oceanarray-0.3.0/oceanarray/report → oceanarray-0.5.0/oceanarray/reports}/_html_helpers.py +234 -228
- oceanarray-0.5.0/oceanarray/reports/_instrument.py +656 -0
- oceanarray-0.5.0/oceanarray/reports/_manifest.py +545 -0
- oceanarray-0.5.0/oceanarray/reports/_mooring.py +862 -0
- oceanarray-0.5.0/oceanarray/reports/_navs.py +198 -0
- oceanarray-0.5.0/oceanarray/reports/_nc_tables.py +176 -0
- oceanarray-0.5.0/oceanarray/reports/_pdf.py +417 -0
- {oceanarray-0.3.0/oceanarray/report → oceanarray-0.5.0/oceanarray/reports}/_plots.py +285 -348
- {oceanarray-0.3.0/oceanarray/report → oceanarray-0.5.0/oceanarray/reports}/_recovery_table.py +25 -171
- oceanarray-0.5.0/oceanarray/reports/_report_css.py +23 -0
- oceanarray-0.5.0/oceanarray/reports/_slots.py +62 -0
- oceanarray-0.5.0/oceanarray/reports/_stack.py +1099 -0
- oceanarray-0.5.0/oceanarray/reports/templates/_grid_history.html +10 -0
- oceanarray-0.5.0/oceanarray/reports/templates/_instrument_analog_yaml.html +12 -0
- oceanarray-0.5.0/oceanarray/reports/templates/_instrument_files.html +39 -0
- oceanarray-0.5.0/oceanarray/reports/templates/_instrument_qc.html +65 -0
- oceanarray-0.5.0/oceanarray/reports/templates/_instrument_rose_note.html +6 -0
- oceanarray-0.5.0/oceanarray/reports/templates/_instrument_windows_note.html +36 -0
- oceanarray-0.5.0/oceanarray/reports/templates/_macros.html +87 -0
- oceanarray-0.5.0/oceanarray/reports/templates/_mooring_calibration.html +51 -0
- oceanarray-0.5.0/oceanarray/reports/templates/_mooring_clock_table.html +59 -0
- oceanarray-0.5.0/oceanarray/reports/templates/_mooring_diagram.html +5 -0
- oceanarray-0.5.0/oceanarray/reports/templates/_mooring_instruments.html +101 -0
- oceanarray-0.5.0/oceanarray/reports/templates/_mooring_issues.html +28 -0
- oceanarray-0.5.0/oceanarray/reports/templates/_mooring_pipeline.html +103 -0
- oceanarray-0.5.0/oceanarray/reports/templates/_mooring_qc.html +72 -0
- oceanarray-0.5.0/oceanarray/reports/templates/_mooring_timing.html +156 -0
- oceanarray-0.5.0/oceanarray/reports/templates/_nav.html +24 -0
- oceanarray-0.5.0/oceanarray/reports/templates/_nc_coords.html +15 -0
- oceanarray-0.5.0/oceanarray/reports/templates/_nc_globals.html +21 -0
- oceanarray-0.5.0/oceanarray/reports/templates/_nc_scalars.html +24 -0
- oceanarray-0.5.0/oceanarray/reports/templates/_nc_var_macros.html +32 -0
- oceanarray-0.5.0/oceanarray/reports/templates/_nc_variables.html +20 -0
- oceanarray-0.5.0/oceanarray/reports/templates/_stack_instr_table.html +16 -0
- oceanarray-0.5.0/oceanarray/reports/templates/_stack_roses_note.html +13 -0
- oceanarray-0.5.0/oceanarray/reports/templates/array.html +150 -0
- oceanarray-0.5.0/oceanarray/reports/templates/base.html +115 -0
- oceanarray-0.5.0/oceanarray/reports/templates/grid.html +43 -0
- oceanarray-0.5.0/oceanarray/reports/templates/instrument.html +36 -0
- oceanarray-0.5.0/oceanarray/reports/templates/mooring.html +91 -0
- oceanarray-0.5.0/oceanarray/reports/templates/recovery_table.html +129 -0
- oceanarray-0.5.0/oceanarray/reports/templates/stack.html +28 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/tools/__init__.py +0 -1
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/tools/rapid_interp.py +17 -23
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/tools/readers.py +16 -18
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/utilities.py +115 -36
- oceanarray-0.5.0/oceanarray/writers/__init__.py +13 -0
- oceanarray-0.5.0/oceanarray/writers/netcdf.py +364 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0/oceanarray.egg-info}/PKG-INFO +30 -11
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray.egg-info/SOURCES.txt +95 -25
- oceanarray-0.5.0/oceanarray.egg-info/requires.txt +37 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray.egg-info/scm_file_list.json +95 -25
- oceanarray-0.5.0/oceanarray.egg-info/scm_version.json +8 -0
- oceanarray-0.5.0/pyproject.toml +209 -0
- oceanarray-0.5.0/scripts/check_vendored.py +111 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/conftest.py +5 -4
- oceanarray-0.5.0/tests/fixtures/caldip/castM4_caldip.nc +0 -0
- oceanarray-0.5.0/tests/fixtures/golden/dune2/dune2_1_2026_grid_report.html +923 -0
- oceanarray-0.5.0/tests/fixtures/golden/dune2/dune2_1_2026_report.html +1697 -0
- oceanarray-0.5.0/tests/fixtures/golden/dune2/dune2_1_2026_stack_report.html +1529 -0
- oceanarray-0.5.0/tests/fixtures/golden/dune2/instrument/dune2_1_2026_2941_report.html +1332 -0
- oceanarray-0.5.0/tests/fixtures/golden/dune2/instrument/dune2_1_2026_9920_report.html +2091 -0
- oceanarray-0.5.0/tests/fixtures/proc/MIXSED2026.array.yaml +94 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/fixtures/proc/dune2_1_2026/aquadopp/dune2_1_2026_9920_stage1.nc +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/fixtures/proc/dune2_1_2026/aquadopp/dune2_1_2026_9920_stage2.nc +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/fixtures/proc/dune2_1_2026/aquadopp/dune2_1_2026_9920_stage3.nc +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/fixtures/proc/dune2_1_2026/dune2_1_2026_grid.nc +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/fixtures/proc/dune2_1_2026/dune2_1_2026_stack.nc +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/fixtures/proc/dune2_1_2026/microcat/dune2_1_2026_2941_stage1.nc +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/fixtures/proc/dune2_1_2026/microcat/dune2_1_2026_2941_stage2.nc +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/fixtures/proc/dune2_1_2026/microcat/dune2_1_2026_2941_stage3.nc +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/integration/test_pipeline.py +3 -3
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/integration/test_recovery_table.py +1 -1
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/integration/test_stage1_from_raw.py +65 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/integration/test_time_gridding.py +9 -3
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/legacy/test_convertOS.py +2 -1
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/legacy/test_mooring_rodb.py +1 -2
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/legacy/test_rodb.py +2 -2
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/unit/test_array.py +51 -3
- oceanarray-0.5.0/tests/unit/test_caldip.py +164 -0
- oceanarray-0.5.0/tests/unit/test_canonical_units.py +342 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/unit/test_cli.py +47 -25
- oceanarray-0.5.0/tests/unit/test_grid_clamp.py +45 -0
- oceanarray-0.5.0/tests/unit/test_grid_manifest.py +291 -0
- oceanarray-0.5.0/tests/unit/test_helpers.py +260 -0
- oceanarray-0.5.0/tests/unit/test_instrument_manifest.py +73 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/unit/test_logger.py +2 -2
- oceanarray-0.5.0/tests/unit/test_manifest.py +372 -0
- oceanarray-0.5.0/tests/unit/test_mooring_manifest.py +66 -0
- oceanarray-0.5.0/tests/unit/test_nav.py +143 -0
- oceanarray-0.5.0/tests/unit/test_nc_tables.py +55 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/unit/test_parameters.py +1 -1
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/unit/test_paths.py +44 -2
- oceanarray-0.5.0/tests/unit/test_pdf_report.py +384 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/unit/test_plot_guard.py +23 -41
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/unit/test_plotters.py +103 -0
- oceanarray-0.5.0/tests/unit/test_pressure.py +323 -0
- oceanarray-0.5.0/tests/unit/test_qc.py +361 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/unit/test_recovery_table.py +2 -2
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/unit/test_report.py +46 -13
- oceanarray-0.5.0/tests/unit/test_report_golden.py +205 -0
- oceanarray-0.5.0/tests/unit/test_report_tokens.py +186 -0
- oceanarray-0.5.0/tests/unit/test_stack_omission.py +73 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/unit/test_stage1.py +83 -17
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/unit/test_stage3.py +7 -3
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/unit/test_time_gridding.py +1 -3
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/unit/test_tools.py +1 -2
- oceanarray-0.5.0/tests/unit/test_unit_label_literals.py +60 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/unit/test_utilities.py +91 -6
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/unit/test_validation.py +132 -1
- oceanarray-0.5.0/tests/unit/test_vendored.py +41 -0
- oceanarray-0.5.0/tests/unit/test_writers_netcdf.py +453 -0
- oceanarray-0.3.0/.github/PULL_REQUEST_TEMPLATE.md +0 -45
- oceanarray-0.3.0/.github/dependabot.yml +0 -48
- oceanarray-0.3.0/.github/workflows/tests.yml +0 -63
- oceanarray-0.3.0/CHANGELOG.md +0 -117
- oceanarray-0.3.0/MIGRATION-BASEDIR.md +0 -190
- oceanarray-0.3.0/docs/source/methods/calibration.rst +0 -107
- oceanarray-0.3.0/docs/source/setup.md +0 -92
- oceanarray-0.3.0/environment.yml +0 -13
- oceanarray-0.3.0/notebooks/demo_mooring.ipynb +0 -408
- oceanarray-0.3.0/notebooks/demo_step1.ipynb +0 -696
- oceanarray-0.3.0/notebooks/legacy/README.md +0 -18
- oceanarray-0.3.0/oceanarray/__init__.py +0 -22
- oceanarray-0.3.0/oceanarray/_version.py +0 -1
- oceanarray-0.3.0/oceanarray/oceanarray.mplstyle +0 -18
- oceanarray-0.3.0/oceanarray/plotters/helpers.py +0 -244
- oceanarray-0.3.0/oceanarray/plotters/primitives.py +0 -336
- oceanarray-0.3.0/oceanarray/processors/caldip.py +0 -1
- oceanarray-0.3.0/oceanarray/report/__init__.py +0 -5
- oceanarray-0.3.0/oceanarray/report/_grid.py +0 -558
- oceanarray-0.3.0/oceanarray/report/_instrument.py +0 -866
- oceanarray-0.3.0/oceanarray/report/_mooring.py +0 -1514
- oceanarray-0.3.0/oceanarray/report/_stack.py +0 -950
- oceanarray-0.3.0/oceanarray/tools/writers.py +0 -103
- oceanarray-0.3.0/oceanarray.egg-info/requires.txt +0 -14
- oceanarray-0.3.0/oceanarray.egg-info/scm_version.json +0 -8
- oceanarray-0.3.0/pyproject.toml +0 -143
- oceanarray-0.3.0/pytest.ini +0 -7
- oceanarray-0.3.0/requirements-dev.txt +0 -21
- oceanarray-0.3.0/requirements-test.txt +0 -5
- oceanarray-0.3.0/requirements.txt +0 -31
- oceanarray-0.3.0/tests/unit/test_writers.py +0 -100
- {oceanarray-0.3.0 → oceanarray-0.5.0}/.github/ISSUE_TEMPLATE.md +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/LICENSE +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/_static/How do I transform a coordinate system manually_ /342/200/223 Nortek Support Center.pdf +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/_static/array_processing.png +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/_static/array_processing_v2.png +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/_static/code/3_beam_transformation.py +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/_static/code/auto_filt.m +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/_static/code/hydro_grid.m +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/_static/code/microcat2rodb_2.m +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/_static/code/microcat2rodb_3.m +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/_static/code/microcat_apply_cal.m +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/_static/code/microcat_apply_cal_plus.m +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/_static/code/microcat_raw2use_003.m +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/_static/code/mooring_interp_wb2_3_5.m +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/_static/css/custom.css +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/_static/github_solo_workflow.png +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/_static/github_workflow2.png +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/_static/instrument_processing.png +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/_static/instrument_processing_v2.png +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/_static/instrument_processing_v4.png +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/_static/instrument_processing_v5.png +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/_static/instrument_processing_v6.png +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/_static/logo.png +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/_static/mooring_processing.png +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/_static/mooring_processing_V2.png +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/_static/mooring_processing_v3.png +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/_static/mooring_processing_v4.png +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/_static/oceanarray_grid_report.png +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/_static/oceanarray_icon.png +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/_static/oceanarray_instrument_report.png +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/_static/oceanarray_report_header.png +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/_static/oceanarray_stack_report.png +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/_static/rotary_spectrum_plan.rst +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/conf.py +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/file_naming_conventions.rst +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/methods/conversion.rst +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/methods/multisite_merging.rst +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/methods/nortek_coordinate_transform.rst +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/methods/trimming.rst +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/docs/source/oceanSITES_manual.rst +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/notebooks/demo_climatology.ipynb +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/notebooks/dsE_1_2018_microcat_7518_temperature.png +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/notebooks/legacy/demo_batch_instrument.ipynb +0 -0
- {oceanarray-0.3.0/notebooks → oceanarray-0.5.0/notebooks/legacy}/demo_check_clock.ipynb +0 -0
- {oceanarray-0.3.0/notebooks → oceanarray-0.5.0/notebooks/legacy}/demo_clock_offset.ipynb +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/notebooks/legacy/demo_instrument_rdb.ipynb +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/notebooks/legacy/demo_mooring_rdb.ipynb +0 -0
- {oceanarray-0.3.0/notebooks → oceanarray-0.5.0/notebooks/legacy}/demo_stage1.ipynb +0 -0
- {oceanarray-0.3.0/notebooks → oceanarray-0.5.0/notebooks/legacy}/demo_stage2.ipynb +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/analysis/__init__.py +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/analysis/vector.py +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/config/OS1_sensor_attrs.yaml +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/config/OS1_var_names.yaml +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/config/__init__.py +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/config/legacy/project_RAPID.yaml +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/config/legacy/rodb_keys.txt +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/config/legacy/rodb_keys.yaml +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/config/logging.yaml +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/legacy/OS1_vocab_attrs.yaml +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/legacy/__init__.py +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/legacy/caldip.py +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/legacy/convertOS.py +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/legacy/find_deployment.py +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/legacy/mooring_rodb.py +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/legacy/process_rodb.py +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/legacy/rodb.py +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray/legacy/tools.py +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray.egg-info/dependency_links.txt +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray.egg-info/entry_points.txt +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/oceanarray.egg-info/top_level.txt +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/setup.cfg +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/fixtures/proc/dune2_1_2026/dune2_1_2026.mooring.yaml +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/fixtures/raw/dune2_1_2026/aquadopp/9920_recovery.dat +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/fixtures/raw/dune2_1_2026/aquadopp/9920_recovery.hdr +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/fixtures/raw/dune2_1_2026/microcat/2941_recovery.asc +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/fixtures/regenerate_dune2_microcat.py +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/integration/__init__.py +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/integration/conftest.py +1 -1
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/integration/test_readers.py +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/integration/test_stage1.py +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/integration/test_stage2.py +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/legacy/__init__.py +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/legacy/test_process_rodb.py +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/test_imports.py +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/unit/__init__.py +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/unit/test_flag_merge.py +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/unit/test_process_api.py +0 -0
- {oceanarray-0.3.0 → oceanarray-0.5.0}/tests/unit/test_stage2.py +0 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Generated report HTML: exclude both from GitHub language stats and collapse in
|
|
2
|
+
# PR diffs (linguist-generated). Golden fixtures stay diffable — their images are
|
|
3
|
+
# masked, so text/structure diffs are meaningful on rebaseline. The hosted demo
|
|
4
|
+
# reports are pure display artifacts: `binary` (= -diff -merge -text) treats them
|
|
5
|
+
# as opaque blobs — no textual diff, no merge, no line-ending normalization. Both
|
|
6
|
+
# remain tracked/committed (the demo suite is served from _static by Sphinx).
|
|
7
|
+
tests/fixtures/golden/** linguist-generated=true
|
|
8
|
+
docs/source/_static/demo/** linguist-generated=true binary
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Title: prefix with one tag — [DOC] [FIX] [FEAT] [REFACTOR] [TEST] [CI] [CLEANUP]
|
|
3
|
+
Example: [FIX] Correct dimension handling in RBR reader
|
|
4
|
+
Keep it concise. Delete any section that does not apply (except Summary).
|
|
5
|
+
Write each bullet/paragraph as one continuous line — GitHub soft-wraps.
|
|
6
|
+
-->
|
|
7
|
+
|
|
8
|
+
## Summary
|
|
9
|
+
|
|
10
|
+
What changed and why, in one short paragraph.
|
|
11
|
+
|
|
12
|
+
## What's changed
|
|
13
|
+
|
|
14
|
+
- Concrete change (one bullet each).
|
|
15
|
+
|
|
16
|
+
## Breaking changes
|
|
17
|
+
|
|
18
|
+
Each breaking change and how to migrate (removed/renamed public API or CLI flag, changed signature or parameter meaning, changed output/config layout). Write "None" if there are none — keep the section so reviewers see it was considered.
|
|
19
|
+
|
|
20
|
+
## Notes
|
|
21
|
+
|
|
22
|
+
Optional — design decisions or trade-offs, screenshots if outputs changed, related issues (Fixes #, Related to #), and anything reviewers should look at closely.
|
|
23
|
+
|
|
24
|
+
## Checklist
|
|
25
|
+
|
|
26
|
+
- [ ] Followed the [code conventions](CONTRIBUTING.md)
|
|
27
|
+
- [ ] Added or updated tests to cover the change
|
|
28
|
+
- [ ] Updated documentation if needed
|
|
29
|
+
- [ ] Ran `ruff check . --fix` and `pytest` — all pass
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
- package-ecosystem: "github-actions"
|
|
4
|
+
directory: "/"
|
|
5
|
+
schedule:
|
|
6
|
+
interval: "monthly"
|
|
7
|
+
time: "09:00"
|
|
8
|
+
open-pull-requests-limit: 5
|
|
9
|
+
commit-message:
|
|
10
|
+
prefix: "[CI]"
|
|
11
|
+
include: "scope"
|
|
12
|
+
reviewers:
|
|
13
|
+
- "eleanorfrajka"
|
|
14
|
+
assignees:
|
|
15
|
+
- "eleanorfrajka"
|
|
16
|
+
labels:
|
|
17
|
+
- "github-actions"
|
|
18
|
+
- "automated"
|
|
@@ -16,14 +16,14 @@ jobs:
|
|
|
16
16
|
|
|
17
17
|
steps:
|
|
18
18
|
- name: Checkout
|
|
19
|
-
uses: actions/checkout@
|
|
19
|
+
uses: actions/checkout@v7
|
|
20
20
|
with:
|
|
21
21
|
fetch-depth: 0
|
|
22
22
|
|
|
23
23
|
- name: Setup Micromamba
|
|
24
|
-
uses: mamba-org/setup-micromamba@
|
|
24
|
+
uses: mamba-org/setup-micromamba@v3
|
|
25
25
|
with:
|
|
26
|
-
environment-file: environment.yml
|
|
26
|
+
environment-file: docs/environment.yml
|
|
27
27
|
init-shell: bash
|
|
28
28
|
condarc: |
|
|
29
29
|
channels:
|
|
@@ -35,14 +35,13 @@ jobs:
|
|
|
35
35
|
shell: bash -l {0}
|
|
36
36
|
run: |
|
|
37
37
|
micromamba run -n oceanarray python -m pip install --upgrade pip
|
|
38
|
-
micromamba run -n oceanarray python -m pip install -e . --
|
|
38
|
+
micromamba run -n oceanarray python -m pip install -e ".[dev]" --force-reinstall
|
|
39
39
|
|
|
40
40
|
- name: Build documentation
|
|
41
41
|
shell: bash -l {0}
|
|
42
42
|
run: |
|
|
43
43
|
set -e
|
|
44
|
-
micromamba run -n oceanarray jupyter nbconvert --to notebook --execute notebooks/
|
|
45
|
-
micromamba run -n oceanarray jupyter nbconvert --to notebook --execute notebooks/demo_mooring.ipynb --output=demo_mooring-output.ipynb --ExecutePreprocessor.allow_errors=True
|
|
44
|
+
micromamba run -n oceanarray jupyter nbconvert --to notebook --execute notebooks/demo_mooring.ipynb --output=demo_mooring-output.ipynb
|
|
46
45
|
mv notebooks/*output.ipynb docs/source/
|
|
47
46
|
pushd docs
|
|
48
47
|
micromamba run -n oceanarray make clean html
|
|
@@ -15,14 +15,14 @@ jobs:
|
|
|
15
15
|
|
|
16
16
|
steps:
|
|
17
17
|
- name: Checkout
|
|
18
|
-
uses: actions/checkout@
|
|
18
|
+
uses: actions/checkout@v7
|
|
19
19
|
with:
|
|
20
20
|
fetch-depth: 0
|
|
21
21
|
|
|
22
22
|
- name: Setup Micromamba
|
|
23
|
-
uses: mamba-org/setup-micromamba@
|
|
23
|
+
uses: mamba-org/setup-micromamba@v3
|
|
24
24
|
with:
|
|
25
|
-
environment-file: environment.yml
|
|
25
|
+
environment-file: docs/environment.yml
|
|
26
26
|
init-shell: bash
|
|
27
27
|
condarc: |
|
|
28
28
|
channels:
|
|
@@ -34,14 +34,13 @@ jobs:
|
|
|
34
34
|
shell: bash -l {0}
|
|
35
35
|
run: |
|
|
36
36
|
micromamba run -n oceanarray python -m pip install --upgrade pip
|
|
37
|
-
micromamba run -n oceanarray python -m pip install -e . --
|
|
37
|
+
micromamba run -n oceanarray python -m pip install -e ".[dev]" --force-reinstall
|
|
38
38
|
|
|
39
39
|
- name: Build documentation
|
|
40
40
|
shell: bash -l {0}
|
|
41
41
|
run: |
|
|
42
42
|
set -e
|
|
43
|
-
micromamba run -n oceanarray jupyter nbconvert --to notebook --execute notebooks/
|
|
44
|
-
micromamba run -n oceanarray jupyter nbconvert --to notebook --execute notebooks/demo_mooring.ipynb --output=demo_mooring-output.ipynb --ExecutePreprocessor.allow_errors=True
|
|
43
|
+
micromamba run -n oceanarray jupyter nbconvert --to notebook --execute notebooks/demo_mooring.ipynb --output=demo_mooring-output.ipynb
|
|
45
44
|
mv notebooks/*output.ipynb docs/source/
|
|
46
45
|
pushd docs
|
|
47
46
|
micromamba run -n oceanarray make clean html
|
|
@@ -26,7 +26,7 @@ jobs:
|
|
|
26
26
|
id-token: write
|
|
27
27
|
|
|
28
28
|
steps:
|
|
29
|
-
- uses: actions/checkout@
|
|
29
|
+
- uses: actions/checkout@v7
|
|
30
30
|
with:
|
|
31
31
|
ref: ${{ github.ref }}
|
|
32
32
|
fetch-depth: 0
|
|
@@ -35,9 +35,9 @@ jobs:
|
|
|
35
35
|
run: git clean -fxd
|
|
36
36
|
|
|
37
37
|
- name: Set up Python
|
|
38
|
-
uses: actions/setup-python@
|
|
38
|
+
uses: actions/setup-python@v7
|
|
39
39
|
with:
|
|
40
|
-
python-version: "3.
|
|
40
|
+
python-version: "3.13"
|
|
41
41
|
|
|
42
42
|
- name: Install build tools
|
|
43
43
|
run: |
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
name: Run tests
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main] # post-merge on main only
|
|
6
|
+
pull_request: # every PR (branch pushes run here, not twice)
|
|
7
|
+
|
|
8
|
+
# Cancel superseded runs when a branch/PR is pushed again in quick succession.
|
|
9
|
+
concurrency:
|
|
10
|
+
group: tests-${{ github.workflow }}-${{ github.ref }}
|
|
11
|
+
cancel-in-progress: true
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
unit:
|
|
15
|
+
runs-on: ${{ matrix.os }}
|
|
16
|
+
# Any leg marked experimental is allowed to fail without cancelling real jobs.
|
|
17
|
+
continue-on-error: ${{ matrix.experimental == true }}
|
|
18
|
+
strategy:
|
|
19
|
+
fail-fast: false
|
|
20
|
+
matrix:
|
|
21
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
22
|
+
python-version: ["3.11"] # full 3-OS coverage on the primary version
|
|
23
|
+
include:
|
|
24
|
+
# Verify the supported range (requires-python >=3.11; docs say 3.11–3.13),
|
|
25
|
+
# ubuntu-only to keep the job count down.
|
|
26
|
+
- { os: ubuntu-latest, python-version: "3.12" }
|
|
27
|
+
- { os: ubuntu-latest, python-version: "3.13" }
|
|
28
|
+
|
|
29
|
+
steps:
|
|
30
|
+
- uses: actions/checkout@v7
|
|
31
|
+
|
|
32
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
33
|
+
uses: actions/setup-python@v7
|
|
34
|
+
with:
|
|
35
|
+
python-version: ${{ matrix.python-version }}
|
|
36
|
+
cache: "pip"
|
|
37
|
+
|
|
38
|
+
- name: Install oceanarray (test extra = runtime + pytest)
|
|
39
|
+
run: |
|
|
40
|
+
python -m pip install --upgrade pip
|
|
41
|
+
pip install -e ".[test]"
|
|
42
|
+
|
|
43
|
+
- name: Run unit tests
|
|
44
|
+
# Coverage gate runs once, on the canonical ubuntu + 3.11 leg; the extra
|
|
45
|
+
# version legs run --no-cov so they only verify install + test pass.
|
|
46
|
+
run: >
|
|
47
|
+
pytest tests/unit -m "not slow and not local and not needs_seasenselib" -q
|
|
48
|
+
${{ (matrix.os == 'ubuntu-latest' && matrix.python-version == '3.11') && '--cov=oceanarray --cov-report=term-missing --cov-fail-under=38' || '--no-cov' }}
|
|
49
|
+
|
|
50
|
+
integration:
|
|
51
|
+
runs-on: ubuntu-latest
|
|
52
|
+
steps:
|
|
53
|
+
- uses: actions/checkout@v7
|
|
54
|
+
|
|
55
|
+
- name: Set up Python 3.11
|
|
56
|
+
uses: actions/setup-python@v7
|
|
57
|
+
with:
|
|
58
|
+
python-version: "3.11"
|
|
59
|
+
cache: "pip"
|
|
60
|
+
|
|
61
|
+
# seasenselib is a core dependency, so the golden integration tests
|
|
62
|
+
# (stage2/stage3/grid) run for real here rather than skipping.
|
|
63
|
+
- name: Install oceanarray (test extra)
|
|
64
|
+
run: |
|
|
65
|
+
python -m pip install --upgrade pip
|
|
66
|
+
pip install -e ".[test]"
|
|
67
|
+
|
|
68
|
+
- name: Run integration tests
|
|
69
|
+
run: pytest tests/integration -m "not local" -q
|
|
70
|
+
|
|
71
|
+
lint:
|
|
72
|
+
runs-on: ubuntu-latest
|
|
73
|
+
steps:
|
|
74
|
+
- uses: actions/checkout@v7
|
|
75
|
+
|
|
76
|
+
- name: Set up Python 3.11
|
|
77
|
+
uses: actions/setup-python@v7
|
|
78
|
+
with:
|
|
79
|
+
python-version: "3.11"
|
|
80
|
+
|
|
81
|
+
- name: Install ruff
|
|
82
|
+
run: pip install ruff
|
|
83
|
+
|
|
84
|
+
- name: Lint (ruff check)
|
|
85
|
+
run: ruff check .
|
|
86
|
+
|
|
87
|
+
- name: Format check (ruff format)
|
|
88
|
+
run: ruff format --check .
|
|
@@ -22,8 +22,6 @@ debug_caldip.py
|
|
|
22
22
|
example_caldip_usage.py
|
|
23
23
|
simple_caldip_plot.py
|
|
24
24
|
plot_calibration_data.py
|
|
25
|
-
test_caldip.py
|
|
26
|
-
test_caldip_simple.py
|
|
27
25
|
data/moor/proc_calib/
|
|
28
26
|
calibration_data_plot.png
|
|
29
27
|
calibration_dip_comparison.png
|
|
@@ -32,6 +30,9 @@ matlab_calibration/
|
|
|
32
30
|
logs/*log
|
|
33
31
|
|
|
34
32
|
|
|
33
|
+
# macOS
|
|
34
|
+
.DS_Store
|
|
35
|
+
|
|
35
36
|
# VSCode settings
|
|
36
37
|
.vscode/*
|
|
37
38
|
|
|
@@ -212,3 +213,7 @@ data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606397_2018_08_27.cnv
|
|
|
212
213
|
data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606401_2018_08_27.cnv
|
|
213
214
|
data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606402_2018_08_27.cnv
|
|
214
215
|
data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606409_2018_08_27.cnv
|
|
216
|
+
|
|
217
|
+
# Generated report output under test fixtures (HTML + multi-MB PDFs) — regenerated
|
|
218
|
+
# by `oceanarray report ... --pdf`; never commit into history.
|
|
219
|
+
tests/fixtures/proc/*/report/
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to oceanarray are documented here.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## [Unreleased]
|
|
8
|
+
|
|
9
|
+
## [0.5.0] — 2026-10-12
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- **Serial-uniqueness validation** ([#101](https://github.com/ocean-uhh/oceanarray/pull/101)): `validate` refuses duplicate serials within a mooring, a blank serial, and the reserved names `stack`/`grid` (which would collide the per-instrument report filenames `{mooring}_{serial}_report.html`). A trailing `*` is stripped before every check — `1234` and `1234*` on one mooring are a duplicate, a serial that is only `*` is blank — and stays a diagram-only "pay attention to this sensor" annotation, never carried into filenames or nav labels.
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- **Report NetCDF-inventory appendix restyled** ([#103](https://github.com/ocean-uhh/oceanarray/pull/103)): the instrument, stack and grid reports share one inventory appendix — a Coordinates table (one row per coordinate variable: type, units, standard/long name, min/max, N valid, attributes), variables grouped by dimension set, QC companions shown inline as a green `(_QC)`, and global attributes split into named groups with a Type column; the per-page variable/scalar/globals templates collapse to one shared set, and the grid page gains a coordinates table it never had. The dune2 test fixture units were canonicalised in place (14 attribute edits, data byte-identical) and the hosted dune2 example suite regenerated. `demo_mooring.ipynb` is ported to `oceanarray.processors.process` and runs on the committed fixture from a clean checkout; `demo_step1.ipynb` is removed, and five old-API demo notebooks move to `notebooks/legacy/`.
|
|
18
|
+
- **Shared masthead nav** ([#100](https://github.com/ocean-uhh/oceanarray/pull/100)): the report masthead navigation is rebuilt from the shared vendored macro, and the six report-design files are re-vendored from ctdcast with a vendoring guard (`scripts/check_vendored.py`).
|
|
19
|
+
- **Canonical units at every stage** ([#102](https://github.com/ocean-uhh/oceanarray/pull/102)): one canonical spelling per quantity is now written to every file — `degree_Celsius`, `mS cm-1`, `dbar`, `m`, `m s-1`, `umol kg-1`, `g kg-1`, `kg m-3`, `1` (practical salinity and turbidity). A registry-scoped pass (`oceanarray.processors.units.canonicalise_units`) runs on the way out of every stage, rewriting the reader spellings (`degC`, `mS/cm`, `meters`, `db`, `S/m`→×10) to the canonical and recording any value conversion in `units_converted_from` / `units_conversion_factor`. Temperature variables carry CF-1.11 `units_metadata = "temperature: on_scale"`. Plot labels are derived from the canonical string by `format_units` (slash form: `mS/cm`, `m/s`, `kg/m³`, `µmol/kg`, `°C`, `PSU`, `NTU`).
|
|
20
|
+
|
|
21
|
+
- **Single netCDF writer** ([#98](https://github.com/ocean-uhh/oceanarray/pull/98)): the six write paths the processing stages used before now go through one `oceanarray.writers.write` seam. The files that were written uncompressed — the seasenselib-written stage files, whose compression parameters its writer silently discarded, and the bare-`to_netcdf` stage3 output — shrink 58–66% on the dune2 fixtures. The two that were already zlib level-5 compressed — the pressure-gridded and stacked outputs — grow about 1% as they move to the common level-4 setting. Decoded values, dtypes, attributes, and time encoding are unchanged; raw values are byte-identical, verified per stage against the old writer. The private `_get_netcdf_writer_params` methods are removed, including the `quantize` key, which was never a valid netCDF4 encoding parameter and never took effect.
|
|
22
|
+
- **Windows log encoding** ([#98](https://github.com/ocean-uhh/oceanarray/pull/98)): `stage1/2/3` open their per-stage log file as UTF-8. On Windows the default cp1252 encoding raised on the ADCP `BEAM→ENU` log message, which aborted the instrument and silently dropped it from the output.
|
|
23
|
+
- **`oceanarray.writers` exposed** ([#99](https://github.com/ocean-uhh/oceanarray/pull/99)): `import oceanarray as oa; oa.writers.write(ds, path)` now resolves after a bare import.
|
|
24
|
+
- **cftime time coordinates preserved** ([#99](https://github.com/ocean-uhh/oceanarray/pull/99)): a time coordinate decoded with `use_cftime=True` (object dtype, e.g. a non-standard calendar) now keeps its `units` and `calendar` on write instead of letting xarray re-guess the epoch from the data. Numpy `datetime64` time is still pinned to the 1970 epoch; only object-dtype cftime time is affected.
|
|
25
|
+
- **Python 3.13 supported** ([#99](https://github.com/ocean-uhh/oceanarray/pull/99)): added to the classifiers and promoted to a required (no longer allow-failure) CI leg.
|
|
26
|
+
|
|
27
|
+
### Breaking changes
|
|
28
|
+
|
|
29
|
+
- **Units spellings in output files changed** ([#102](https://github.com/ocean-uhh/oceanarray/pull/102)): every processed file now carries the canonical units spelling per quantity (above), so a reader matching the old strings (`degC`, `mS/cm`, `meters`, `S/m`, …) must adapt. An unrecognised or missing `units` on a registered variable now **stops that instrument** (`UnitsError`) rather than passing through silently — one bad instrument is logged with its file and skipped, the rest process; the stack still builds but records the omission in an `instruments_omitted` attribute and exits 1. The `dissolved_oxygen` registry entry is corrected to per-mass `umol kg-1` (standard_name `moles_of_oxygen_per_unit_mass_in_sea_water`); turbidity is dimensionless `1` (display label `NTU`). Conductivity in `S/m` is converted ×10 to `mS cm-1` by the units pass, replacing the old `conductivity_normalised_from` attribute with `units_converted_from` / `units_conversion_factor`.
|
|
30
|
+
- **`process` runs stage 3 by default** ([#102](https://github.com/ocean-uhh/oceanarray/pull/102)): `oceanarray process MOORING` with no `--stage` now runs stages 1, 2 and 3 (was 1 and 2). Pass `--stage 1 2` for the old raw→trim-only behaviour. The help text already described "stages 1-3"; the code now matches it.
|
|
31
|
+
- **Oxygen saturation / AOU recomputed on the correct basis** ([#102](https://github.com/ocean-uhh/oceanarray/pull/102)): `derive_oxygen_saturation` previously divided per-mass `dissolved_oxygen` by in-situ density as if it were per-volume, making `oxygen_saturation_pct` and `apparent_oxygen_utilization` ~2.5% low. It now uses a per-mass (`umol kg-1`) input directly and divides only a genuine per-volume (`umol L-1`) variable. Regenerated oxygen products change by the density factor; moorings without an oxygen sensor (the dune2 example) are unaffected.
|
|
32
|
+
- **Minimum Python raised to 3.11** ([#99](https://github.com/ocean-uhh/oceanarray/pull/99)): `requires-python` is now `>=3.11`; the 3.10 classifier and CI leg are dropped. Python 3.10 reached end-of-life, and the core dependencies (xarray, pandas, numpy, matplotlib, gsw, scipy) already require 3.11 — so a 3.10 install silently resolved years-old, untested versions of the whole stack.
|
|
33
|
+
|
|
34
|
+
- **Dead output helpers removed** ([#99](https://github.com/ocean-uhh/oceanarray/pull/99)): `oceanarray.tools.writers.save_dataset` and `save_OS_instrument` are deleted, and `oceanarray/tools/writers.py` with them. Neither had a working caller (only tests and a dead `if 0:` notebook cell); `save_dataset` also wrote `NETCDF4_CLASSIC`, a format nothing else produced. Use `oceanarray.writers.write`. Two legacy notebooks (`notebooks/legacy/demo_batch_instrument.ipynb`, `notebooks/legacy/demo_instrument_rdb.ipynb`) still reference `save_OS_instrument` and no longer run; they are not CI-executed and are left for the notebook refresh.
|
|
35
|
+
- **`None` attributes dropped, not blanked** ([#99](https://github.com/ocean-uhh/oceanarray/pull/99)): a `None`-valued attribute (global or per-variable) is now dropped with a warning instead of written as `""`. `UNK` belongs where a value is determined, not the write seam. On the dune2 fixtures no attribute is affected (0/84 globals are empty); this is a guardrail.
|
|
36
|
+
- **Time encoding pinned** ([#99](https://github.com/ocean-uhh/oceanarray/pull/99)): every datetime variable is written as `seconds since 1970-01-01` (float64, `proleptic_gregorian`) rather than xarray's per-file guess. Decoded instants change by at most 0.13 µs (float64 seconds have ~238 ns spacing at the 2026 epoch, so ≤119 ns rounding; ~0.5 µs by 2050) — negligible against clock drift, which is corrected in whole seconds. **Raw stored values change**, so a reader using `decode_times=False`/`decode_cf=False` sees different numbers. This also removes a pandas-version dependence in the units string (space vs `T`).
|
|
37
|
+
|
|
38
|
+
### Known issues
|
|
39
|
+
|
|
40
|
+
- **Empty-units turbidity files**: a registered variable with an empty `units` fails that one instrument at stage 1 — the handler logs `ERROR: <file>: <reason>`, skips the instrument, and the mooring completes with the others and a non-zero exit (the family rule). Six turbidity files on the drive are affected; the reader fix lands in 0.5.1.
|
|
41
|
+
- **dune2 test fixture stack/grid**: the committed `_stack.nc`/`_grid.nc` fixtures reference instruments not present in the committed raw and YAML — they were built from the full mooring before the fixture was trimmed to two instruments — so running `oceanarray run` on the fixture collapses the stack to those two. A known fixture inconsistency, rebuilt in 0.5.1.
|
|
42
|
+
|
|
43
|
+
## [0.4.0] — 2026-09-08
|
|
44
|
+
|
|
45
|
+
### Added
|
|
46
|
+
|
|
47
|
+
- **caldip calibration-dip stub** ([#92](https://github.com/ocean-uhh/oceanarray/pull/92)): `processors/caldip.py` carries the shared contract (constants, `normalize_serial`, `Offsets`) and a five-function interface for the planned front-of-Stage-3 correction. Stage 3 gains a `caldip_dir` argument that is a null action — it logs a warning and stamps a `caldip_applied` provenance attribute — until the correction lands.
|
|
48
|
+
- **PDF reports**: `report --pdf` renders a merged A4 PDF per mooring ([#69](https://github.com/ocean-uhh/oceanarray/pull/69)); `report --pdf-dir DIR` collects each mooring's PDF into one directory ([#90](https://github.com/ocean-uhh/oceanarray/pull/90)), which also sped up PDF rendering (~50 s → ~6 s).
|
|
49
|
+
- **Manifest-driven report system**: a section-manifest model and resolver ([#78](https://github.com/ocean-uhh/oceanarray/pull/78)) now drive the grid ([#79](https://github.com/ocean-uhh/oceanarray/pull/79)) and stack / instrument / mooring ([#80](https://github.com/ocean-uhh/oceanarray/pull/80)) report pages — per-page registries, automatic panel numbering, generated jump-nav, and defect-visible stubs.
|
|
50
|
+
- **`oceanarray run` report redirection** ([#88](https://github.com/ocean-uhh/oceanarray/pull/88)): `run` accepts `-o/--output-dir`, `--report-dir`, and `--sig-level`, threaded through to the report step, so the full pipeline can write a portable central report tree with custom grid isopycnal targets in one command.
|
|
51
|
+
- **Zenodo DOI** ([#68](https://github.com/ocean-uhh/oceanarray/pull/68)): concept-DOI badge in the README and `CITATION.cff`.
|
|
52
|
+
- A hosted, clickable dune2 example report suite in the docs ([#82](https://github.com/ocean-uhh/oceanarray/pull/82)).
|
|
53
|
+
|
|
54
|
+
### Changed
|
|
55
|
+
|
|
56
|
+
- **Report subsystem refactor**: vendored the shared design tokens, encoder, and CSS ([#71](https://github.com/ocean-uhh/oceanarray/pull/71)); added a golden-file regression net ([#72](https://github.com/ocean-uhh/oceanarray/pull/72)); renamed `report/` → `reports/` ([#73](https://github.com/ocean-uhh/oceanarray/pull/73)); reworked page templates ([#74](https://github.com/ocean-uhh/oceanarray/pull/74)); encoder / figure sizing ([#75](https://github.com/ocean-uhh/oceanarray/pull/75)); uniform layout fixes ([#76](https://github.com/ocean-uhh/oceanarray/pull/76), [#77](https://github.com/ocean-uhh/oceanarray/pull/77)); plot polish — colorbar ticks, cyclic current direction, T-S bounds, tilt panels ([#83](https://github.com/ocean-uhh/oceanarray/pull/83)); layout polish — shared title helper, trajectory y-labels, clock legend, rose whitespace ([#84](https://github.com/ocean-uhh/oceanarray/pull/84)); smaller files, updated fonts, and multi-panel pagination ([#70](https://github.com/ocean-uhh/oceanarray/pull/70)).
|
|
57
|
+
- **Packaging**: consolidated configuration into `pyproject.toml`, expanded the CI test matrix, and added a ruff lint gate ([#86](https://github.com/ocean-uhh/oceanarray/pull/86)); moved the dev install to pyproject extras ([#85](https://github.com/ocean-uhh/oceanarray/pull/85)); dropped the unused direct `dolfyn` dependency ([#81](https://github.com/ocean-uhh/oceanarray/pull/81)).
|
|
58
|
+
- **Docs**: PyPI-first install instructions ([#81](https://github.com/ocean-uhh/oceanarray/pull/81)); caldip documented as the planned optional front-of-Stage-3 correction ([#91](https://github.com/ocean-uhh/oceanarray/pull/91)).
|
|
59
|
+
|
|
60
|
+
### Fixed
|
|
61
|
+
|
|
62
|
+
- Cross-page links now resolve in the merged PDF — the document is built once and rendered once, with per-page anchor-id namespacing ([#89](https://github.com/ocean-uhh/oceanarray/pull/89)).
|
|
63
|
+
- Conservative QC-flag resampling fix, with unit tests added for the pressure, helpers, and qc paths ([#87](https://github.com/ocean-uhh/oceanarray/pull/87)).
|
|
64
|
+
- `process` / `report` / `run` `--help` no longer crash on Python 3.11 — an argparse usage-formatting `AssertionError` from a single-member mutually-exclusive group around the suppressed `--basedir` flag; the group is removed ([#88](https://github.com/ocean-uhh/oceanarray/pull/88)).
|
|
65
|
+
|
|
66
|
+
### Breaking changes
|
|
67
|
+
|
|
68
|
+
- **`oceanarray stack` / `oceanarray grid` removed** ([#88](https://github.com/ocean-uhh/oceanarray/pull/88)): the standalone subcommands (deprecated since 0.2.0) are deleted. Use `oceanarray process MOORING --stage stack grid` — all flags (`--dt`, `--dp`, `--pmin`, `--pmax`, `--force`, `--proc-dir`) carry over; `stack`/`grid` remain available as `--stage` tokens.
|
|
69
|
+
- **`oceanarray logsheet` removed** ([#88](https://github.com/ocean-uhh/oceanarray/pull/88)): the disabled subcommand is deleted (now an argparse "invalid choice" error, not a `DeprecationWarning`). Use the standalone [`logsheet`](https://github.com/eleanorfrajka/logsheet) package.
|
|
70
|
+
- **Python 3.9 dropped** ([#85](https://github.com/ocean-uhh/oceanarray/pull/85)): the minimum supported version is now 3.10.
|
|
71
|
+
- Internal: `oceanarray.cli.cmd_stub` renamed to `cmd_init`; `cmd_stack`, `cmd_grid`, `cmd_logsheet` deleted. Affects only code importing these functions directly; the `oceanarray init` command is unchanged.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## [0.3.0] — 2026-08-11
|
|
76
|
+
|
|
77
|
+
### Breaking changes
|
|
78
|
+
|
|
79
|
+
- **`oceanarray.logsheet` subpackage deleted** ([#66](https://github.com/ocean-uhh/oceanarray/pull/66)): the deprecated `logsheet` subpackage has been removed from the tree. `oceanarray logsheet` still emits a `DeprecationWarning` and exits 1. Use the standalone [`logsheet`](https://github.com/eleanorfrajka/logsheet) package: `pip install git+https://github.com/eleanorfrajka/logsheet`, then `logsheet build ...`.
|
|
80
|
+
- **`oceanarray run` skips grid when stack fails** ([#65](https://github.com/ocean-uhh/oceanarray/pull/65)): if the stack stage fails, the grid stage is now skipped rather than attempted on incomplete input. This matches `process()` behaviour.
|
|
81
|
+
|
|
82
|
+
### Bug fixes
|
|
83
|
+
|
|
84
|
+
- **Grid report N² computed at latitude 0**: the grid report derived buoyancy frequency (N²) at latitude 0° because its `_dms_to_deg` import still pointed at the removed `mooring_level` module and failed silently inside a broad `except`. The import now resolves from `utilities`, so N² uses the mooring's actual latitude.
|
|
85
|
+
|
|
86
|
+
### Refactoring
|
|
87
|
+
|
|
88
|
+
- **`STAGES` registry as single source of truth in CLI dispatch** ([#65](https://github.com/ocean-uhh/oceanarray/pull/65)): `process()` accepts a stage list (always applied in `STAGES` order); `cmd_process` and `cmd_run` route through a single `process()` call; argparse `choices` are derived from `STAGES`.
|
|
89
|
+
- **Plot/report hardening** ([#64](https://github.com/ocean-uhh/oceanarray/pull/64)): `render_b64` guard, `plt.style.context`, `vlabel()` helper, `SIGMA_GRID` fix, and a `VARIABLES` registry (21 entries with `valid_min`/`valid_max`).
|
|
90
|
+
|
|
91
|
+
### Documentation
|
|
92
|
+
|
|
93
|
+
- Updated developer docs (`project_structure.md`, `methods/standardisation.rst`, `methods/vertical_gridding.rst`, `methods/nortek_coordinate_transform.rst`, `legacy.rst`) to the current `oceanarray.processors.*` module layout after the reorg; fixed broken import examples and API references.
|
|
94
|
+
|
|
95
|
+
### Tests
|
|
96
|
+
|
|
97
|
+
- Golden Stage 1 tests, reader and `_array` helper tests, plus associated bug fixes and dead-code removal ([#63](https://github.com/ocean-uhh/oceanarray/pull/63)).
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## [0.2.0] — 2026-08-07
|
|
102
|
+
|
|
103
|
+
### Breaking changes
|
|
104
|
+
|
|
105
|
+
- **`oceanarray logsheet` disabled**: calling `oceanarray logsheet` now emits a `DeprecationWarning` and exits 1. The `logsheet` subpackage remains in the tree but is unused (deleted in v0.3.0). Use the standalone [`logsheet`](https://github.com/eleanorfrajka/logsheet) package: `pip install git+https://github.com/eleanorfrajka/logsheet`, then `logsheet build ...`.
|
|
106
|
+
- **`--basedir` removed** ([#52](https://github.com/ocean-uhh/oceanarray/pull/52)): use `--raw-dir` and `--proc-dir` instead. See the [migration guide](https://ocean-uhh.github.io/oceanarray/migration.html).
|
|
107
|
+
- **`plotter.py` retired** ([#53](https://github.com/ocean-uhh/oceanarray/pull/53)): the monolithic `oceanarray/plotter.py` and all backward-compatibility re-export shims have been removed. Import from canonical modules (`oceanarray.plotters.current`, `oceanarray.plotters.timeseries`, etc.).
|
|
108
|
+
- **Subpackage reorganisation** ([#49](https://github.com/ocean-uhh/oceanarray/pull/49), [#59](https://github.com/ocean-uhh/oceanarray/pull/59)): processing modules moved from `oceanarray/instrument/` and `oceanarray/mooring/` into `oceanarray.processors.*`. Top-level `oceanarray` imports unchanged; internal paths have moved.
|
|
109
|
+
|
|
110
|
+
### New features
|
|
111
|
+
|
|
112
|
+
- **`--stage stack grid` in `oceanarray process`**: the `--stage` flag now accepts `stack` and `grid` in addition to `1`, `2`, `3`. Run the full pipeline as `oceanarray process MOORING --stage 1 2 3 stack grid`. New flags `--dt`, `--dp`, `--pmin`, `--pmax` added to `process` (same defaults as `oceanarray run`).
|
|
113
|
+
- **`process()` public API** ([#58](https://github.com/ocean-uhh/oceanarray/pull/58)): `oceanarray.process(mooring_yaml, proc_dir, stages=…)` runs any combination of Stage 1–3, stack, and grid in a single call. `oceanarray.STAGES` is the registry of available stages.
|
|
114
|
+
- **Array report** ([#48](https://github.com/ocean-uhh/oceanarray/pull/48)): `oceanarray report <array.yaml> --array` generates a multi-mooring HTML summary with smart rebuild (only re-renders sections whose NC files are newer than the existing report).
|
|
115
|
+
- **Wave / frequency diagnostics** ([#47](https://github.com/ocean-uhh/oceanarray/pull/47)): rotary power spectra, near-inertial band energy, and wave diagnostics added to ADCP instrument reports.
|
|
116
|
+
- **Release automation** ([#61](https://github.com/ocean-uhh/oceanarray/pull/61)): pushing a `v*` tag now auto-creates a draft GitHub release with PR-based release notes; publishing the draft triggers PyPI upload.
|
|
117
|
+
|
|
118
|
+
### Bug fixes
|
|
119
|
+
|
|
120
|
+
- **QC flags unified to OceanSITES table** ([#54](https://github.com/ocean-uhh/oceanarray/pull/54)): all QC flag values now use the standard OceanSITES convention (0 no QC, 1 good, 2 probably good, 3 probably bad, 4 bad, 9 missing). Previously mixed conventions caused flag collisions on merge.
|
|
121
|
+
- **Plot regularisation** ([#50](https://github.com/ocean-uhh/oceanarray/pull/50)): fixed irregular time-axis sampling in instrument report figures.
|
|
122
|
+
- **Turbidity `units=MISSING`** ([#61](https://github.com/ocean-uhh/oceanarray/pull/61)): stage1 now strips placeholder `units` strings (`"MISSING"`, `""`) written by the RBR RSK reader when the instrument database has no units entry, and emits a `UserWarning` so the operator can verify the sensor spec.
|
|
123
|
+
|
|
124
|
+
### Deprecations
|
|
125
|
+
|
|
126
|
+
- **`oceanarray stack`**: deprecated in favour of `oceanarray process MOORING --stage stack`. Emits `DeprecationWarning`. Will be removed in v0.3.0.
|
|
127
|
+
- **`oceanarray grid`**: deprecated in favour of `oceanarray process MOORING --stage grid`. Emits `DeprecationWarning`. Will be removed in v0.3.0.
|
|
128
|
+
- `file_type: rbr-hex-oa` remapped automatically to `rbr-hex` with a `DeprecationWarning`; update mooring YAMLs.
|
|
129
|
+
- `file_type: sbe-asc` remapped automatically to `sbe-ascii`.
|
|
130
|
+
|
|
131
|
+
### Refactoring
|
|
132
|
+
|
|
133
|
+
- Single-source variable registries in `parameters.py`; `validation.py` derives from it ([#51](https://github.com/ocean-uhh/oceanarray/pull/51)).
|
|
134
|
+
- Figure-returning shape for `report/_plots.py` ([#56](https://github.com/ocean-uhh/oceanarray/pull/56)); `draw_*` helpers relocated to `plotters/` ([#57](https://github.com/ocean-uhh/oceanarray/pull/57)).
|
|
135
|
+
- Type annotations backfilled on `hydrographic.py` and `temporal.py`; two ANN per-file-ignores removed from `pyproject.toml`.
|
|
136
|
+
|
|
137
|
+
### Tests
|
|
138
|
+
|
|
139
|
+
- Integration chain tests (stage1 → stage2 → stage3 → stack → grid) over committed `dune2_1_2026` fixtures ([#60](https://github.com/ocean-uhh/oceanarray/pull/60)).
|
|
140
|
+
- CI: integration job now installs seasenselib from PyPI; Windows and macOS unit jobs run seasenselib-free.
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## [0.1.0] — 2026-07-27
|
|
145
|
+
|
|
146
|
+
First public release.
|
|
147
|
+
|
|
148
|
+
### Processing pipeline
|
|
149
|
+
|
|
150
|
+
- **Stage 1** — raw instrument files → CF-NetCDF: Sea-Bird SBE37 MicroCAT (`sbe-cnv`, `sbe-ascii`), Nortek Aquadopp (`nortek-raw`, `nortek-ascii`, `nortek-csv`), RBR Solo/Duet (`rbr-rsk`, `rbr-dat`), RDI WorkHorse ADCP (`rdi-raw`). Nortek BEAM→XYZ transformation matrix parsed from `.hdr` file and applied at stage 1; matrix stored in output for reproducibility.
|
|
151
|
+
- **Stage 2** — deployment trimming (YAML `deployment_time`/`recovery_time`) and linear clock-drift correction from recovery timestamps.
|
|
152
|
+
- **Stage 3** — QARTOD gross-range and spike QC on T/C/S/P; pressure interpolation (QC flag 8) for instruments without a pressure sensor; Aquadopp XYZ→ENU rotation using heading/pitch/roll + IGRF magnetic declination (`ppigrf`); tilt QC on velocity; potential density via `gsw`.
|
|
153
|
+
|
|
154
|
+
### Mooring-level commands
|
|
155
|
+
|
|
156
|
+
- `oceanarray stack` — resample all instruments to a common time axis, stack into a single `(time, N_LEVELS)` dataset ordered deep-first.
|
|
157
|
+
- `oceanarray grid` — linearly interpolate the stacked dataset onto a regular pressure grid (`--pmin`, `--pmax`, `--dp`).
|
|
158
|
+
|
|
159
|
+
### Reporting
|
|
160
|
+
|
|
161
|
+
- `oceanarray report` — self-contained HTML reports (all figures base64-embedded, offline-readable):
|
|
162
|
+
- Mooring summary: deployment metadata, instrument pipeline status, QC flag breakdown, clock corrections, knockdown figures, clock alignment check.
|
|
163
|
+
- Per-instrument pages (`--instruments`): full time series with QC markers, T-S diagram, current roses, data histograms, QC table, scalar metadata.
|
|
164
|
+
- Stack report (`--stack`): pressure/T/S/velocity time series, T-S diagram, current roses, spacing histogram.
|
|
165
|
+
- Grid report (`--grid`): T/S/density pcolormesh, N², velocity sections, T-S diagram, power spectra.
|
|
166
|
+
- Array report (`--array`): position map, summary table with clickable links to mooring reports.
|
|
167
|
+
|
|
168
|
+
### CLI
|
|
169
|
+
|
|
170
|
+
- `oceanarray process` — run stage 1, 2, and/or 3 for a mooring or a single instrument (`--serial`).
|
|
171
|
+
- `oceanarray run` — complete pipeline in one command (process + stack + grid + report).
|
|
172
|
+
- `oceanarray validate` — check mooring YAML for missing fields and unknown instrument types.
|
|
173
|
+
- `oceanarray list` — print accepted `instrument:` names and `file_type:` values.
|
|
174
|
+
- `oceanarray logsheet` — generate PDF logsheets from YAML instrument inventory.
|
|
175
|
+
|
|
176
|
+
### Logsheets
|
|
177
|
+
|
|
178
|
+
- `oceanarray logsheet` subcommand generates LaTeX-rendered PDF deployment logsheets from a cruise configuration YAML.
|
|
179
|
+
|
|
180
|
+
### Notable design choices
|
|
181
|
+
|
|
182
|
+
- Data provenance: all processing parameters (QC thresholds, declination value, transformation matrix) stored as NetCDF attributes so any file can be reprocessed exactly from itself.
|
|
183
|
+
- Discrete colorbars throughout (≤ 20 levels, `BoundaryNorm`).
|
|
184
|
+
- CF-convention variable names and standard names throughout; OceanSITES QC flag values.
|
|
185
|
+
- `seasenselib` is used for raw file reading but is a separate install (`pip install seasenselib --no-deps` — see installation docs).
|
|
@@ -6,8 +6,9 @@ authors:
|
|
|
6
6
|
orcid: https://orcid.org/0000-0001-8773-7838
|
|
7
7
|
affiliation: University of Hamburg, Bundesstraße 53, 20146 Hamburg, Germany
|
|
8
8
|
title: oceanarray
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
doi: 10.5281/zenodo.21890564
|
|
10
|
+
version: 0.5.0
|
|
11
|
+
date-released: 2026-10-12
|
|
11
12
|
url: https://github.com/ocean-uhh/oceanarray
|
|
12
13
|
repository-code: https://github.com/ocean-uhh/oceanarray
|
|
13
14
|
license: MIT
|
|
@@ -6,6 +6,8 @@ All contributions are welcome: bug reports, feature suggestions, documentation i
|
|
|
6
6
|
|
|
7
7
|
## Table of Contents
|
|
8
8
|
|
|
9
|
+
- [Licensing of contributions](#licensing-of-contributions)
|
|
10
|
+
- [Credit and authorship](#credit-and-authorship)
|
|
9
11
|
- [I Have a Question](#i-have-a-question)
|
|
10
12
|
- [Reporting Bugs](#reporting-bugs)
|
|
11
13
|
- [Suggesting Enhancements](#suggesting-enhancements)
|
|
@@ -14,6 +16,33 @@ All contributions are welcome: bug reports, feature suggestions, documentation i
|
|
|
14
16
|
|
|
15
17
|
---
|
|
16
18
|
|
|
19
|
+
## Licensing of contributions
|
|
20
|
+
|
|
21
|
+
oceanarray is MIT licensed, and contributions are accepted **under the same licence** — what GitHub calls "inbound = outbound". By opening a pull request you confirm that:
|
|
22
|
+
|
|
23
|
+
1. you wrote the contribution, or you have the right to submit it; and
|
|
24
|
+
2. you agree to license it to the project under the MIT licence.
|
|
25
|
+
|
|
26
|
+
This does not transfer your copyright, which remains yours.
|
|
27
|
+
|
|
28
|
+
**If your contribution contains code from somewhere else** — another repository, a paper's supplementary material, a Stack Overflow answer, a colleague's script, or generated output you did not review — say so in the pull request and name the source and its licence. This is the single most useful thing you can tell a reviewer. Code from an unlicensed source cannot be merged until its author agrees, so flagging it early avoids the work being wasted.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Credit and authorship
|
|
33
|
+
|
|
34
|
+
Three separate things.
|
|
35
|
+
|
|
36
|
+
**Copyright** stays with whoever wrote the code. You are not asked to assign it.
|
|
37
|
+
|
|
38
|
+
**Contributor credit** is automatic: everyone whose pull request is merged appears in the git history. If your name or preferred email in the git log is wrong, add a `.mailmap` entry via a pull request — that is the correct fix.
|
|
39
|
+
|
|
40
|
+
**Citation authorship** is the author list in `CITATION.cff`, which propagates into the Zenodo DOI for every release and therefore into other people's bibliographies. It reflects *substantial* contribution to the software — its design, a significant body of its implementation, its test suite, or its documentation architecture — and is decided by the maintainer at release time. Funding or supervision alone does not qualify. There is no line count that guarantees it or excludes it. If you believe your contribution crosses that line and it has not been reflected, please say so in an issue — being asked is better than being resented.
|
|
41
|
+
|
|
42
|
+
Where a contribution is adapted from someone else's work rather than written from scratch, we credit it **in the docstring of the code itself**, so the attribution travels with the code rather than living in a file nobody reads (see the existing examples in `utilities.py` and `plotters/current.py`).
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
17
46
|
## I Have a Question
|
|
18
47
|
|
|
19
48
|
Read the [documentation](https://ocean-uhh.github.io/oceanarray/) first.
|
|
@@ -75,19 +104,31 @@ Processing flows from raw files → Stage 1 (CF-NetCDF) → Stage 2 (trimming +
|
|
|
75
104
|
git clone https://github.com/ocean-uhh/oceanarray.git
|
|
76
105
|
cd oceanarray
|
|
77
106
|
python -m venv venv && source venv/bin/activate
|
|
78
|
-
pip install
|
|
79
|
-
pip install -
|
|
80
|
-
# seasenselib (needed for raw file reading):
|
|
81
|
-
pip install pyrsktools pycnv
|
|
82
|
-
pip install seasenselib --no-deps
|
|
107
|
+
pip install --upgrade pip
|
|
108
|
+
pip install -e ".[dev]"
|
|
83
109
|
```
|
|
84
110
|
|
|
111
|
+
This installs the runtime stack (including `seasenselib` for raw-file reading),
|
|
112
|
+
plus the test and docs tooling and `ruff`, in one resolution. To also work on
|
|
113
|
+
PDF report output (WeasyPrint, which needs native pango/cairo libraries), use
|
|
114
|
+
`pip install -e ".[all]"` (everything, equivalent to `.[dev,pdf]`).
|
|
115
|
+
|
|
85
116
|
### Workflow
|
|
86
117
|
|
|
87
118
|
1. Fork the repository and create a feature branch from `main`.
|
|
88
119
|
2. Make your changes, following the conventions below.
|
|
89
120
|
3. Run `ruff check . --fix` and then `pytest` — all tests must pass.
|
|
90
|
-
4. Open a pull request against `main`.
|
|
121
|
+
4. Open a pull request against `main`. Prefix the title with a bracket tag: `[FEAT]`, `[FIX]`, `[REFACTOR]`, `[DOC]`, `[TEST]`, `[CI]`, or `[CLEANUP]`. (PR titles use bracket tags; individual **commit messages** use conventional-commit prefixes — see below.)
|
|
122
|
+
|
|
123
|
+
Keep each pull request to one logical change. A rename PR that also fixes a bug is a PR nobody can review — split them. (This matters most once more than one person is working on the code.)
|
|
124
|
+
|
|
125
|
+
### Commit messages
|
|
126
|
+
|
|
127
|
+
Use conventional-commit prefixes (`feat:`, `fix:`, `refactor:`, `docs:`, `test:`, `ci:`, `chore:`) with an imperative subject. If you worked with someone, or adapted their code, add a trailer:
|
|
128
|
+
|
|
129
|
+
```
|
|
130
|
+
Co-authored-by: Name <email@example.com>
|
|
131
|
+
```
|
|
91
132
|
|
|
92
133
|
### Code conventions
|
|
93
134
|
|
|
@@ -97,6 +138,7 @@ pip install seasenselib --no-deps
|
|
|
97
138
|
- **Units**: never strip or assume units. Use `gsw` for all seawater property calculations.
|
|
98
139
|
- **Plot style**: discrete colorbars (`BoundaryNorm`, ≤ 20 levels); call `plt.style.use(str(P.MPLSTYLE))` at the start of every plot function.
|
|
99
140
|
- **Data provenance**: store all processing parameters (thresholds, coefficients) in NC output attributes so any file can be reprocessed exactly from itself.
|
|
141
|
+
- **No silent defaults**: never substitute a default, guess, or approximation when the correct value cannot be determined. Raise, or warn loudly and record what was assumed in the output's metadata. A plausible wrong number is worse than an error, because nothing downstream can detect it.
|
|
100
142
|
|
|
101
143
|
### Testing
|
|
102
144
|
|
|
@@ -108,7 +150,7 @@ pytest tests/unit -m "not slow and not needs_seasenselib" # without seasenselib
|
|
|
108
150
|
pytest --cov=oceanarray --cov-report=term-missing -q # with coverage
|
|
109
151
|
```
|
|
110
152
|
|
|
111
|
-
New or changed code must have test
|
|
153
|
+
New or changed code must have a test. For anything numerical, assert a **value** you can justify independently of the code — `pytest.approx` or `numpy.testing.assert_allclose` against an analytic case, an invariant that must hold for any input, or a cross-check against `gsw` or another implementation — rather than a value produced by running the code (which proves only that the code has not changed). Do not add tests that pass when nothing happened: `assert result is not None` on a function that returns `None` on failure is the shape to avoid. Integration tests use committed NetCDF fixtures in `tests/fixtures/`.
|
|
112
154
|
|
|
113
155
|
---
|
|
114
156
|
|
|
@@ -117,7 +159,7 @@ New or changed code must have test coverage. Integration tests use committed Net
|
|
|
117
159
|
Documentation is built with Sphinx from `docs/source/`. To build locally:
|
|
118
160
|
|
|
119
161
|
```bash
|
|
120
|
-
pip install -
|
|
162
|
+
pip install -e ".[docs]"
|
|
121
163
|
cd docs && make clean html
|
|
122
164
|
open build/html/index.html
|
|
123
165
|
```
|