oceanarray 0.4.0__tar.gz → 0.5.1__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.
Files changed (344) hide show
  1. {oceanarray-0.4.0 → oceanarray-0.5.1}/.github/workflows/docs.yml +3 -4
  2. {oceanarray-0.4.0 → oceanarray-0.5.1}/.github/workflows/docs_deploy.yml +3 -4
  3. {oceanarray-0.4.0 → oceanarray-0.5.1}/.github/workflows/pypi.yml +3 -3
  4. {oceanarray-0.4.0 → oceanarray-0.5.1}/.github/workflows/tests.yml +18 -13
  5. oceanarray-0.5.1/CHANGELOG.md +227 -0
  6. {oceanarray-0.4.0 → oceanarray-0.5.1}/CITATION.cff +2 -2
  7. {oceanarray-0.4.0 → oceanarray-0.5.1}/CONTRIBUTING.md +23 -7
  8. {oceanarray-0.4.0/oceanarray.egg-info → oceanarray-0.5.1}/PKG-INFO +7 -4
  9. {oceanarray-0.4.0 → oceanarray-0.5.1}/README.md +3 -1
  10. oceanarray-0.5.1/docs/source/_static/demo/dune2/dune2_1_2026_grid_report.html +939 -0
  11. oceanarray-0.5.1/docs/source/_static/demo/dune2/dune2_1_2026_report.html +9281 -0
  12. oceanarray-0.5.1/docs/source/_static/demo/dune2/dune2_1_2026_stack_report.html +1549 -0
  13. oceanarray-0.5.1/docs/source/_static/demo/dune2/instrument/dune2_1_2026_2941_report.html +1377 -0
  14. oceanarray-0.5.1/docs/source/_static/demo/dune2/instrument/dune2_1_2026_9920_report.html +2138 -0
  15. oceanarray-0.5.1/docs/source/cli_reference.rst +320 -0
  16. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/clock_offset.rst +2 -2
  17. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/conf.py +1 -0
  18. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/installation.rst +1 -2
  19. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/legacy.rst +2 -0
  20. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/methods/concatenation.rst +1 -1
  21. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/methods/standardisation.rst +5 -5
  22. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/migration.rst +26 -0
  23. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/oceanarray.rst +9 -5
  24. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/project_structure.md +1 -2
  25. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/quickstart.rst +1 -1
  26. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/reports.rst +9 -6
  27. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/yaml_configuration.rst +38 -1
  28. oceanarray-0.5.1/notebooks/demo_mooring.ipynb +363 -0
  29. oceanarray-0.5.1/notebooks/legacy/README.md +21 -0
  30. {oceanarray-0.4.0 → oceanarray-0.5.1}/notebooks/legacy/demo_batch_instrument.ipynb +3 -3
  31. {oceanarray-0.4.0/notebooks → oceanarray-0.5.1/notebooks/legacy}/demo_instrument.ipynb +5 -9
  32. {oceanarray-0.4.0 → oceanarray-0.5.1}/notebooks/legacy/demo_instrument_rdb.ipynb +3 -3
  33. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/__init__.py +6 -0
  34. oceanarray-0.5.1/oceanarray/_version.py +1 -0
  35. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/cli.py +15 -13
  36. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/config/parameters.py +182 -62
  37. oceanarray-0.5.1/oceanarray/config/unit_tables.py +199 -0
  38. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/config/validation.py +165 -2
  39. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/paths.py +5 -1
  40. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/plotters/_cli_legacy.py +6 -2
  41. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/plotters/animation.py +2 -1
  42. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/plotters/current.py +42 -19
  43. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/plotters/diagnostic.py +49 -19
  44. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/plotters/helpers.py +7 -5
  45. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/plotters/hydrography.py +10 -3
  46. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/plotters/primitives.py +1 -1
  47. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/plotters/spectrum.py +8 -2
  48. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/plotters/timeseries.py +7 -4
  49. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/plotters/ts.py +1 -1
  50. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/processors/__init__.py +38 -1
  51. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/processors/caldip.py +4 -2
  52. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/processors/coordinate.py +11 -1
  53. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/processors/grid.py +38 -50
  54. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/processors/pressure.py +133 -27
  55. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/processors/qc.py +44 -41
  56. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/processors/stack.py +89 -14
  57. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/processors/stage1.py +146 -84
  58. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/processors/stage2.py +22 -49
  59. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/processors/stage3.py +25 -20
  60. oceanarray-0.5.1/oceanarray/processors/units.py +270 -0
  61. oceanarray-0.5.1/oceanarray/reports/__init__.py +32 -0
  62. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/_array.py +254 -24
  63. oceanarray-0.5.1/oceanarray/reports/_env.py +194 -0
  64. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/_figdebug.py +90 -10
  65. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/_grid.py +66 -56
  66. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/_html_helpers.py +134 -244
  67. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/_instrument.py +64 -53
  68. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/_mooring.py +22 -30
  69. oceanarray-0.5.1/oceanarray/reports/_navs.py +198 -0
  70. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/_pdf.py +4 -2
  71. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/_plots.py +8 -8
  72. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/_recovery_table.py +3 -2
  73. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/_slots.py +1 -1
  74. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/_stack.py +52 -29
  75. oceanarray-0.5.1/oceanarray/reports/_vendored/MANIFEST.txt +22 -0
  76. oceanarray-0.5.1/oceanarray/reports/_vendored/README.md +36 -0
  77. oceanarray-0.5.1/oceanarray/reports/_vendored/__init__.py +18 -0
  78. oceanarray-0.5.1/oceanarray/reports/_vendored/check.py +337 -0
  79. oceanarray-0.5.1/oceanarray/reports/_vendored/css.py +488 -0
  80. oceanarray-0.4.0/oceanarray/config/report_tokens.py → oceanarray-0.5.1/oceanarray/reports/_vendored/design_tokens.py +203 -22
  81. oceanarray-0.4.0/oceanarray/reports/_encode.py → oceanarray-0.5.1/oceanarray/reports/_vendored/figure_png.py +68 -9
  82. oceanarray-0.5.1/oceanarray/reports/_vendored/leaflet/LICENSE +26 -0
  83. oceanarray-0.5.1/oceanarray/reports/_vendored/leaflet/leaflet.min.css +8 -0
  84. oceanarray-0.5.1/oceanarray/reports/_vendored/leaflet/leaflet.min.js +12 -0
  85. oceanarray-0.5.1/oceanarray/reports/_vendored/leaflet.py +241 -0
  86. oceanarray-0.5.1/oceanarray/reports/_vendored/nc_tables.py +888 -0
  87. oceanarray-0.4.0/oceanarray/reports/_manifest.py → oceanarray-0.5.1/oceanarray/reports/_vendored/page_model.py +140 -13
  88. oceanarray-0.5.1/oceanarray/reports/_vendored/templates/_map.html +259 -0
  89. oceanarray-0.5.1/oceanarray/reports/_vendored/templates/_nav.html +29 -0
  90. oceanarray-0.5.1/oceanarray/reports/_vendored/templates/_nc_tables.html +321 -0
  91. oceanarray-0.5.1/oceanarray/reports/_vendored/units.py +366 -0
  92. oceanarray-0.5.1/oceanarray/reports/_vendored/units_tables.py +161 -0
  93. oceanarray-0.5.1/oceanarray/reports/design.py +127 -0
  94. oceanarray-0.5.1/oceanarray/reports/templates/_grid_history.html +18 -0
  95. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_instrument_files.html +8 -2
  96. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_macros.html +2 -1
  97. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/templates/array.html +29 -13
  98. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/templates/base.html +15 -17
  99. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/tools/__init__.py +0 -1
  100. oceanarray-0.5.1/oceanarray/tools/readers.py +558 -0
  101. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/utilities.py +2 -2
  102. oceanarray-0.5.1/oceanarray/writers/__init__.py +13 -0
  103. oceanarray-0.5.1/oceanarray/writers/netcdf.py +364 -0
  104. {oceanarray-0.4.0 → oceanarray-0.5.1/oceanarray.egg-info}/PKG-INFO +7 -4
  105. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray.egg-info/SOURCES.txt +53 -25
  106. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray.egg-info/requires.txt +1 -0
  107. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray.egg-info/scm_file_list.json +53 -25
  108. oceanarray-0.5.1/oceanarray.egg-info/scm_version.json +8 -0
  109. {oceanarray-0.4.0 → oceanarray-0.5.1}/pyproject.toml +16 -6
  110. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/conftest.py +6 -5
  111. oceanarray-0.5.1/tests/fixtures/adcp/dsG2_adcp_stage3_knockdown.nc +0 -0
  112. oceanarray-0.5.1/tests/fixtures/golden/dune2/dune2_1_2026_grid_report.html +801 -0
  113. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/fixtures/golden/dune2/dune2_1_2026_report.html +217 -24
  114. oceanarray-0.5.1/tests/fixtures/golden/dune2/dune2_1_2026_stack_report.html +1045 -0
  115. oceanarray-0.5.1/tests/fixtures/golden/dune2/instrument/dune2_1_2026_2941_report.html +1048 -0
  116. oceanarray-0.5.1/tests/fixtures/golden/dune2/instrument/dune2_1_2026_9920_report.html +1378 -0
  117. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/fixtures/proc/dune2_1_2026/aquadopp/dune2_1_2026_9920_stage1.nc +0 -0
  118. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/fixtures/proc/dune2_1_2026/aquadopp/dune2_1_2026_9920_stage2.nc +0 -0
  119. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/fixtures/proc/dune2_1_2026/aquadopp/dune2_1_2026_9920_stage3.nc +0 -0
  120. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/fixtures/proc/dune2_1_2026/dune2_1_2026_grid.nc +0 -0
  121. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/fixtures/proc/dune2_1_2026/dune2_1_2026_stack.nc +0 -0
  122. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/fixtures/proc/dune2_1_2026/microcat/dune2_1_2026_2941_stage1.nc +0 -0
  123. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/fixtures/proc/dune2_1_2026/microcat/dune2_1_2026_2941_stage2.nc +0 -0
  124. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/fixtures/proc/dune2_1_2026/microcat/dune2_1_2026_2941_stage3.nc +0 -0
  125. oceanarray-0.5.1/tests/fixtures/raw/osnap/CF7_MCTD_2020_22225_50m.nc +0 -0
  126. oceanarray-0.5.1/tests/fixtures/raw/osnap/OS_OSNAP-10633_KPO_1111_K7_201408_D_MCTD_OSNAPstyleOceanSITES.nc +0 -0
  127. oceanarray-0.5.1/tests/fixtures/raw/osnap/OS_OSNAP_WHOI_CF7_202007_CM_500m.nc +0 -0
  128. oceanarray-0.5.1/tests/fixtures/raw/osnap/README.md +38 -0
  129. oceanarray-0.5.1/tests/fixtures/raw/osnap/rtwb1_01_2014_001.microcat +491 -0
  130. oceanarray-0.5.1/tests/fixtures/raw/osnap/rtwb1_01_2014_11021.edt +492 -0
  131. oceanarray-0.5.1/tests/fixtures/raw/osnap/run_example.sh +42 -0
  132. oceanarray-0.5.1/tests/integration/test_osnap_pipeline.py +141 -0
  133. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/integration/test_stage1_from_raw.py +65 -0
  134. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/integration/test_time_gridding.py +6 -0
  135. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/unit/test_array.py +43 -1
  136. oceanarray-0.5.1/tests/unit/test_base_css_no_vendored_dup.py +79 -0
  137. oceanarray-0.5.1/tests/unit/test_canonical_units.py +481 -0
  138. oceanarray-0.5.1/tests/unit/test_grid_clamp.py +45 -0
  139. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/unit/test_grid_manifest.py +7 -19
  140. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/unit/test_instrument_manifest.py +1 -1
  141. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/unit/test_manifest.py +1 -1
  142. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/unit/test_mooring_manifest.py +1 -1
  143. oceanarray-0.5.1/tests/unit/test_nav.py +143 -0
  144. oceanarray-0.5.1/tests/unit/test_nc_tables.py +62 -0
  145. oceanarray-0.5.1/tests/unit/test_osnap_readers.py +155 -0
  146. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/unit/test_parameters.py +16 -8
  147. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/unit/test_plot_guard.py +1 -1
  148. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/unit/test_plotters.py +49 -0
  149. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/unit/test_pressure.py +128 -0
  150. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/unit/test_qc.py +49 -48
  151. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/unit/test_report.py +100 -15
  152. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/unit/test_report_golden.py +12 -18
  153. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/unit/test_report_tokens.py +2 -2
  154. oceanarray-0.5.1/tests/unit/test_stack_omission.py +112 -0
  155. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/unit/test_stage1.py +58 -28
  156. oceanarray-0.5.1/tests/unit/test_stub_reason.py +63 -0
  157. oceanarray-0.5.1/tests/unit/test_unit_label_literals.py +64 -0
  158. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/unit/test_utilities.py +12 -0
  159. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/unit/test_validation.py +144 -1
  160. oceanarray-0.5.1/tests/unit/test_vendored.py +38 -0
  161. oceanarray-0.5.1/tests/unit/test_writers_netcdf.py +453 -0
  162. oceanarray-0.4.0/CHANGELOG.md +0 -151
  163. oceanarray-0.4.0/MIGRATION-BASEDIR.md +0 -188
  164. oceanarray-0.4.0/docs/source/_static/demo/dune2/dune2_1_2026_grid_report.html +0 -684
  165. oceanarray-0.4.0/docs/source/_static/demo/dune2/dune2_1_2026_report.html +0 -1600
  166. oceanarray-0.4.0/docs/source/_static/demo/dune2/dune2_1_2026_stack_report.html +0 -1217
  167. oceanarray-0.4.0/docs/source/_static/demo/dune2/instrument/dune2_1_2026_2941_report.html +0 -1084
  168. oceanarray-0.4.0/docs/source/_static/demo/dune2/instrument/dune2_1_2026_9920_report.html +0 -1827
  169. oceanarray-0.4.0/docs/source/cli_reference.rst +0 -666
  170. oceanarray-0.4.0/notebooks/demo_mooring.ipynb +0 -408
  171. oceanarray-0.4.0/notebooks/demo_step1.ipynb +0 -696
  172. oceanarray-0.4.0/notebooks/legacy/README.md +0 -18
  173. oceanarray-0.4.0/oceanarray/_version.py +0 -1
  174. oceanarray-0.4.0/oceanarray/reports/__init__.py +0 -6
  175. oceanarray-0.4.0/oceanarray/reports/_css.py +0 -267
  176. oceanarray-0.4.0/oceanarray/reports/_env.py +0 -101
  177. oceanarray-0.4.0/oceanarray/reports/_report_css.py +0 -23
  178. oceanarray-0.4.0/oceanarray/reports/templates/_grid_history.html +0 -10
  179. oceanarray-0.4.0/oceanarray/reports/templates/_grid_nc_globals.html +0 -14
  180. oceanarray-0.4.0/oceanarray/reports/templates/_grid_nc_scalars.html +0 -18
  181. oceanarray-0.4.0/oceanarray/reports/templates/_grid_nc_variables.html +0 -30
  182. oceanarray-0.4.0/oceanarray/reports/templates/_instrument_nc_globals.html +0 -14
  183. oceanarray-0.4.0/oceanarray/reports/templates/_instrument_nc_scalars.html +0 -19
  184. oceanarray-0.4.0/oceanarray/reports/templates/_instrument_nc_variables.html +0 -30
  185. oceanarray-0.4.0/oceanarray/reports/templates/_stack_nc_dims.html +0 -11
  186. oceanarray-0.4.0/oceanarray/tools/readers.py +0 -304
  187. oceanarray-0.4.0/oceanarray/tools/writers.py +0 -103
  188. oceanarray-0.4.0/oceanarray.egg-info/scm_version.json +0 -8
  189. oceanarray-0.4.0/tests/fixtures/golden/dune2/dune2_1_2026_grid_report.html +0 -692
  190. oceanarray-0.4.0/tests/fixtures/golden/dune2/dune2_1_2026_stack_report.html +0 -1210
  191. oceanarray-0.4.0/tests/fixtures/golden/dune2/instrument/dune2_1_2026_2941_report.html +0 -1092
  192. oceanarray-0.4.0/tests/fixtures/golden/dune2/instrument/dune2_1_2026_9920_report.html +0 -1835
  193. oceanarray-0.4.0/tests/unit/test_writers.py +0 -100
  194. {oceanarray-0.4.0 → oceanarray-0.5.1}/.gitattributes +0 -0
  195. {oceanarray-0.4.0 → oceanarray-0.5.1}/.github/ISSUE_TEMPLATE.md +0 -0
  196. {oceanarray-0.4.0 → oceanarray-0.5.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  197. {oceanarray-0.4.0 → oceanarray-0.5.1}/.github/dependabot.yml +0 -0
  198. {oceanarray-0.4.0 → oceanarray-0.5.1}/.gitignore +0 -0
  199. {oceanarray-0.4.0 → oceanarray-0.5.1}/LICENSE +0 -0
  200. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/Makefile +0 -0
  201. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/environment.yml +0 -0
  202. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/_static/How do I transform a coordinate system manually_ /342/200/223 Nortek Support Center.pdf" +0 -0
  203. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/_static/array_processing.png +0 -0
  204. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/_static/array_processing_v2.png +0 -0
  205. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/_static/code/3_beam_transformation.py +0 -0
  206. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/_static/code/auto_filt.m +0 -0
  207. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/_static/code/hydro_grid.m +0 -0
  208. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/_static/code/microcat2rodb_2.m +0 -0
  209. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/_static/code/microcat2rodb_3.m +0 -0
  210. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/_static/code/microcat_apply_cal.m +0 -0
  211. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/_static/code/microcat_apply_cal_plus.m +0 -0
  212. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/_static/code/microcat_raw2use_003.m +0 -0
  213. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/_static/code/mooring_interp_wb2_3_5.m +0 -0
  214. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/_static/css/custom.css +0 -0
  215. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/_static/github_solo_workflow.png +0 -0
  216. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/_static/github_workflow2.png +0 -0
  217. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/_static/instrument_processing.png +0 -0
  218. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/_static/instrument_processing_v2.png +0 -0
  219. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/_static/instrument_processing_v4.png +0 -0
  220. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/_static/instrument_processing_v5.png +0 -0
  221. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/_static/instrument_processing_v6.png +0 -0
  222. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/_static/logo.png +0 -0
  223. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/_static/mooring_processing.png +0 -0
  224. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/_static/mooring_processing_V2.png +0 -0
  225. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/_static/mooring_processing_v3.png +0 -0
  226. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/_static/mooring_processing_v4.png +0 -0
  227. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/_static/oceanarray_grid_report.png +0 -0
  228. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/_static/oceanarray_icon.png +0 -0
  229. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/_static/oceanarray_instrument_report.png +0 -0
  230. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/_static/oceanarray_report_header.png +0 -0
  231. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/_static/oceanarray_stack_report.png +0 -0
  232. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/_static/rotary_spectrum_plan.rst +0 -0
  233. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/calibration_dips.rst +0 -0
  234. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/directory_structure.rst +0 -0
  235. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/file_naming_conventions.rst +0 -0
  236. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/index.rst +0 -0
  237. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/methods/acquisition.rst +0 -0
  238. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/methods/auto_qc.rst +0 -0
  239. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/methods/calibration.rst +0 -0
  240. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/methods/conversion.rst +0 -0
  241. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/methods/multisite_merging.rst +0 -0
  242. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/methods/nortek_coordinate_transform.rst +0 -0
  243. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/methods/time_gridding.rst +0 -0
  244. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/methods/trimming.rst +0 -0
  245. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/methods/vertical_gridding.rst +0 -0
  246. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/oceanSITES_manual.rst +0 -0
  247. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/oceanarray_format.rst +0 -0
  248. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/processing_framework.rst +0 -0
  249. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/roadmap.rst +0 -0
  250. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/style_guide.md +0 -0
  251. {oceanarray-0.4.0 → oceanarray-0.5.1}/docs/source/troubleshooting.rst +0 -0
  252. {oceanarray-0.4.0 → oceanarray-0.5.1}/notebooks/demo_climatology.ipynb +0 -0
  253. {oceanarray-0.4.0 → oceanarray-0.5.1}/notebooks/dsE_1_2018_microcat_7518_temperature.png +0 -0
  254. {oceanarray-0.4.0/notebooks → oceanarray-0.5.1/notebooks/legacy}/demo_check_clock.ipynb +0 -0
  255. {oceanarray-0.4.0/notebooks → oceanarray-0.5.1/notebooks/legacy}/demo_clock_offset.ipynb +0 -0
  256. {oceanarray-0.4.0 → oceanarray-0.5.1}/notebooks/legacy/demo_mooring_rdb.ipynb +0 -0
  257. {oceanarray-0.4.0/notebooks → oceanarray-0.5.1/notebooks/legacy}/demo_stage1.ipynb +0 -0
  258. {oceanarray-0.4.0/notebooks → oceanarray-0.5.1/notebooks/legacy}/demo_stage2.ipynb +0 -0
  259. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/analysis/__init__.py +0 -0
  260. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/analysis/clock.py +0 -0
  261. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/analysis/hydrographic.py +0 -0
  262. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/analysis/science.py +0 -0
  263. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/analysis/spectral.py +0 -0
  264. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/analysis/temporal.py +0 -0
  265. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/analysis/vector.py +0 -0
  266. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/config/__init__.py +0 -0
  267. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/config/legacy/project_RAPID.yaml +0 -0
  268. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/config/legacy/rodb_keys.txt +0 -0
  269. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/config/legacy/rodb_keys.yaml +0 -0
  270. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/config/logging.yaml +0 -0
  271. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/inspect.py +0 -0
  272. /oceanarray-0.4.0/oceanarray/config/OS1_sensor_attrs.yaml → /oceanarray-0.5.1/oceanarray/legacy/OS1_sensor_attributes.yaml +0 -0
  273. /oceanarray-0.4.0/oceanarray/legacy/OS1_vocab_attrs.yaml → /oceanarray-0.5.1/oceanarray/legacy/OS1_variable_attributes.yaml +0 -0
  274. /oceanarray-0.4.0/oceanarray/config/OS1_var_names.yaml → /oceanarray-0.5.1/oceanarray/legacy/OS1_variable_names.yaml +0 -0
  275. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/legacy/__init__.py +0 -0
  276. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/legacy/caldip.py +0 -0
  277. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/legacy/convertOS.py +0 -0
  278. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/legacy/find_deployment.py +0 -0
  279. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/legacy/mooring_rodb.py +0 -0
  280. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/legacy/process_rodb.py +0 -0
  281. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/legacy/rodb.py +0 -0
  282. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/legacy/tools.py +0 -0
  283. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/logger.py +0 -0
  284. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/plotters/__init__.py +0 -0
  285. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/processors/helpers.py +0 -0
  286. {oceanarray-0.4.0/oceanarray/config → oceanarray-0.5.1/oceanarray/reports/_vendored}/report.mplstyle +0 -0
  287. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_instrument_analog_yaml.html +0 -0
  288. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_instrument_qc.html +0 -0
  289. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_instrument_rose_note.html +0 -0
  290. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_instrument_windows_note.html +0 -0
  291. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_mooring_calibration.html +0 -0
  292. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_mooring_clock_table.html +0 -0
  293. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_mooring_diagram.html +0 -0
  294. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_mooring_instruments.html +0 -0
  295. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_mooring_issues.html +0 -0
  296. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_mooring_pipeline.html +0 -0
  297. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_mooring_qc.html +0 -0
  298. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_mooring_timing.html +0 -0
  299. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_stack_instr_table.html +0 -0
  300. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/templates/_stack_roses_note.html +0 -0
  301. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/templates/grid.html +0 -0
  302. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/templates/instrument.html +0 -0
  303. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/templates/mooring.html +0 -0
  304. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/templates/recovery_table.html +0 -0
  305. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/reports/templates/stack.html +0 -0
  306. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray/tools/rapid_interp.py +0 -0
  307. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray.egg-info/dependency_links.txt +0 -0
  308. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray.egg-info/entry_points.txt +0 -0
  309. {oceanarray-0.4.0 → oceanarray-0.5.1}/oceanarray.egg-info/top_level.txt +0 -0
  310. {oceanarray-0.4.0 → oceanarray-0.5.1}/setup.cfg +0 -0
  311. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/fixtures/caldip/castM4_caldip.nc +0 -0
  312. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/fixtures/proc/MIXSED2026.array.yaml +0 -0
  313. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/fixtures/proc/dune2_1_2026/dune2_1_2026.mooring.yaml +0 -0
  314. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/fixtures/raw/dune2_1_2026/aquadopp/9920_recovery.dat +0 -0
  315. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/fixtures/raw/dune2_1_2026/aquadopp/9920_recovery.hdr +0 -0
  316. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/fixtures/raw/dune2_1_2026/microcat/2941_recovery.asc +0 -0
  317. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/fixtures/regenerate_dune2_microcat.py +0 -0
  318. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/integration/__init__.py +0 -0
  319. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/integration/conftest.py +0 -0
  320. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/integration/test_pipeline.py +0 -0
  321. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/integration/test_readers.py +0 -0
  322. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/integration/test_recovery_table.py +0 -0
  323. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/integration/test_stage1.py +0 -0
  324. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/integration/test_stage2.py +0 -0
  325. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/legacy/__init__.py +0 -0
  326. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/legacy/test_convertOS.py +0 -0
  327. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/legacy/test_mooring_rodb.py +0 -0
  328. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/legacy/test_process_rodb.py +0 -0
  329. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/legacy/test_rodb.py +0 -0
  330. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/test_imports.py +0 -0
  331. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/unit/__init__.py +0 -0
  332. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/unit/test_caldip.py +0 -0
  333. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/unit/test_cli.py +0 -0
  334. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/unit/test_flag_merge.py +0 -0
  335. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/unit/test_helpers.py +0 -0
  336. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/unit/test_logger.py +0 -0
  337. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/unit/test_paths.py +0 -0
  338. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/unit/test_pdf_report.py +0 -0
  339. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/unit/test_process_api.py +0 -0
  340. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/unit/test_recovery_table.py +0 -0
  341. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/unit/test_stage2.py +0 -0
  342. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/unit/test_stage3.py +0 -0
  343. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/unit/test_time_gridding.py +0 -0
  344. {oceanarray-0.4.0 → oceanarray-0.5.1}/tests/unit/test_tools.py +0 -0
@@ -16,12 +16,12 @@ jobs:
16
16
 
17
17
  steps:
18
18
  - name: Checkout
19
- uses: actions/checkout@v4
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@v2
24
+ uses: mamba-org/setup-micromamba@v3
25
25
  with:
26
26
  environment-file: docs/environment.yml
27
27
  init-shell: bash
@@ -41,8 +41,7 @@ jobs:
41
41
  shell: bash -l {0}
42
42
  run: |
43
43
  set -e
44
- micromamba run -n oceanarray jupyter nbconvert --to notebook --execute notebooks/demo_instrument.ipynb --output=demo_instrument-output.ipynb --ExecutePreprocessor.allow_errors=True
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,12 +15,12 @@ jobs:
15
15
 
16
16
  steps:
17
17
  - name: Checkout
18
- uses: actions/checkout@v4
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@v2
23
+ uses: mamba-org/setup-micromamba@v3
24
24
  with:
25
25
  environment-file: docs/environment.yml
26
26
  init-shell: bash
@@ -40,8 +40,7 @@ jobs:
40
40
  shell: bash -l {0}
41
41
  run: |
42
42
  set -e
43
- micromamba run -n oceanarray jupyter nbconvert --to notebook --execute notebooks/demo_instrument.ipynb --output=demo_instrument-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 --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@v4
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@v5
38
+ uses: actions/setup-python@v7
39
39
  with:
40
- python-version: "3.x"
40
+ python-version: "3.13"
41
41
 
42
42
  - name: Install build tools
43
43
  run: |
@@ -13,7 +13,7 @@ concurrency:
13
13
  jobs:
14
14
  unit:
15
15
  runs-on: ${{ matrix.os }}
16
- # Experimental legs (3.13) are allowed to fail without cancelling real jobs.
16
+ # Any leg marked experimental is allowed to fail without cancelling real jobs.
17
17
  continue-on-error: ${{ matrix.experimental == true }}
18
18
  strategy:
19
19
  fail-fast: false
@@ -21,19 +21,16 @@ jobs:
21
21
  os: [ubuntu-latest, macos-latest, windows-latest]
22
22
  python-version: ["3.11"] # full 3-OS coverage on the primary version
23
23
  include:
24
- # Verify the supported range (requires-python >=3.10; docs say 3.10–3.12),
24
+ # Verify the supported range (requires-python >=3.11; docs say 3.11–3.13),
25
25
  # ubuntu-only to keep the job count down.
26
- - { os: ubuntu-latest, python-version: "3.10" }
27
26
  - { os: ubuntu-latest, python-version: "3.12" }
28
- # 3.13: experimental (allow-failure) — deps such as numba/llvmlite
29
- # (via pylablib -> seasenselib) may not have 3.13 wheels yet.
30
- - { os: ubuntu-latest, python-version: "3.13", experimental: true }
27
+ - { os: ubuntu-latest, python-version: "3.13" }
31
28
 
32
29
  steps:
33
- - uses: actions/checkout@v4
30
+ - uses: actions/checkout@v7
34
31
 
35
32
  - name: Set up Python ${{ matrix.python-version }}
36
- uses: actions/setup-python@v5
33
+ uses: actions/setup-python@v7
37
34
  with:
38
35
  python-version: ${{ matrix.python-version }}
39
36
  cache: "pip"
@@ -46,17 +43,25 @@ jobs:
46
43
  - name: Run unit tests
47
44
  # Coverage gate runs once, on the canonical ubuntu + 3.11 leg; the extra
48
45
  # version legs run --no-cov so they only verify install + test pass.
46
+ env:
47
+ # Windows: the netCDF4 wheel points HDF5_PLUGIN_PATH at its bundled plugins
48
+ # folder, and HDF5 rescans it on every filter query -- xarray calls
49
+ # var.filters() once per variable, so each NETCDF4 open costs ~36 ms/variable
50
+ # on the hosted runner. "::" preloads no plugins. oceanarray writes zlib
51
+ # (built into HDF5), so only zstd/bzip2/blosc files would need them -- none
52
+ # here. No effect on Linux/macOS.
53
+ HDF5_PLUGIN_PRELOAD: "::"
49
54
  run: >
50
55
  pytest tests/unit -m "not slow and not local and not needs_seasenselib" -q
51
- ${{ (matrix.os == 'ubuntu-latest' && matrix.python-version == '3.11') && '--cov=oceanarray --cov-report=term-missing --cov-fail-under=38' || '--no-cov' }}
56
+ ${{ (matrix.os == 'ubuntu-latest' && matrix.python-version == '3.11') && '--cov=oceanarray --cov-report=term-missing --cov-fail-under=58' || '--no-cov' }}
52
57
 
53
58
  integration:
54
59
  runs-on: ubuntu-latest
55
60
  steps:
56
- - uses: actions/checkout@v4
61
+ - uses: actions/checkout@v7
57
62
 
58
63
  - name: Set up Python 3.11
59
- uses: actions/setup-python@v5
64
+ uses: actions/setup-python@v7
60
65
  with:
61
66
  python-version: "3.11"
62
67
  cache: "pip"
@@ -74,10 +79,10 @@ jobs:
74
79
  lint:
75
80
  runs-on: ubuntu-latest
76
81
  steps:
77
- - uses: actions/checkout@v4
82
+ - uses: actions/checkout@v7
78
83
 
79
84
  - name: Set up Python 3.11
80
- uses: actions/setup-python@v5
85
+ uses: actions/setup-python@v7
81
86
  with:
82
87
  python-version: "3.11"
83
88
 
@@ -0,0 +1,227 @@
1
+ # Changelog
2
+
3
+ All notable changes to oceanarray are documented here.
4
+
5
+ ---
6
+
7
+ ## [Unreleased]
8
+
9
+ ## [0.5.1] — 2026-10-23
10
+
11
+ > The units-display entries — *Units tables come from the shared report layer*, *N² keeps the spelling it arrives with*, *Legacy vocabulary files moved and renamed*, and the two *Deprecated* items — landed as direct-to-main commits (`cdcffc9`/`8982831`/`735adaa`, the units display sweep), not a pull request; [#107](https://github.com/ocean-uhh/oceanarray/pull/107) documented the sweep and added the derived-quantity guard. See `.claude/done/ROADMAP.md`.
12
+
13
+ ### Changed
14
+
15
+ - **Post-release tidy** ([#105](https://github.com/ocean-uhh/oceanarray/pull/105)): `find_best_dtype` passes `timedelta64` variables through with their native kind instead of miscasting them; the dead `proc_machine` report-context key is removed; the CLI reference page is generated from the argument parser (`sphinx-argparse`); CONTRIBUTING and the README scope line refreshed.
16
+
17
+ - **Vendored report-design layer adopted** ([#106](https://github.com/ocean-uhh/oceanarray/pull/106)): the report presentation layer moves to `oceanarray/reports/_vendored/`, a directory copied byte-identical from ctdcast `15fa38b` that carries its own `MANIFEST.txt` and self-check (`check.py`). The six scattered vendored files (`config/report_tokens.py`, `config/report.mplstyle`, `reports/_encode.py`, `_css.py`, `_manifest.py`, `templates/_nav.html`), the root `VENDORED.txt`, and `scripts/check_vendored.py` are removed; a new owned `reports/design.py` holds the oceanarray-specific configuration (package accent, QC/sensor predicates, `ATTR_GROUP_EXTRAS`, the per-figure source toggle). `reports/__init__.py` resolves its public names lazily so importing the vendored layer does not pull the page pipeline. No change to the NetCDF outputs or the public API.
18
+ - **NetCDF-inventory tables rendered by the vendored builders** ([#106](https://github.com/ocean-uhh/oceanarray/pull/106)): the coordinates/variables/scalars/globals tables now come from the shared `nc_tables` builders and `_nc_tables.html` macros. Type labels read `string` rather than `str`, each table carries a `source:` caption, the coordinates table gains a Dims column, and the `history` global attribute is shown once (in its dedicated processing-history panel, excluded from the globals table via the builder's `exclude=`). An all-empty Standard/long-name column drops along with units/min-max/attributes (`optional=` includes `stdname`). The QC-companion marker shows the file's real suffix — `(_qc)` for oceanarray's lowercase QC variables, not a hard-coded `(_QC)` — and is coloured with the shared `--qc-mark` token. The local inventory templates and row builders are removed.
19
+ - **Processing-history panel is now tables** ([#106](https://github.com/ocean-uhh/oceanarray/pull/106)): the instrument/grid/stack reports render the processing history as a key/value `properties_table` for the header items plus a sortable Time·Event table for the dated entries (a `|`-joined entry splits into same-time rows), replacing the `dl`-style list that wrapped long entries into orphan rows. The Time·Event table carries a leading `#` column — the row's 1-based position in the `history` attribute — so sorting any column never loses the original sequence (events sharing one timestamp would otherwise be unorderable).
20
+ - **Array page map** ([#106](https://github.com/ocean-uhh/oceanarray/pull/106)): the mooring-position map is the vendored Leaflet `track_map` (a marker per mooring, each carrying a permanent name label in the marker's colour, hover-linked to the mooring list via `data-track-id`, offline bundled assets) behind the `design.ARRAY_MAP_LEAFLET` flag — the interactive map on screen, its matplotlib PNG fallback when printing (never both). The static PNG gains a `source:` caption, a Mercator-square framed extent (a line of moorings no longer renders as a sliver), and family marker colours; the mooring name links to its report and the jump-nav uses the family markup.
21
+ - **Array masthead metadata** ([#106](https://github.com/ocean-uhh/oceanarray/pull/106)): the array summary masthead gains deployment/recovery and duration, position and mooring extent, water-depth range, an instrument by-type breakdown, deployment status, and processed-to counts — all read or derived from the array/mooring YAMLs at render (a missing value is an em-dash).
22
+ - **base.html de-duplicated against the shared stylesheet** ([#106](https://github.com/ocean-uhh/oceanarray/pull/106)): report chrome rules that `emit_css()` already provides are removed from the per-page `<style>` block (only the oceanarray-specific additions remain), guarded by `test_no_base_rule_duplicates_vendored_css`.
23
+ - **Absent figure panels say why** ([#106](https://github.com/ocean-uhh/oceanarray/pull/106)): a figure whose draw raises now renders a short stub with the reason instead of vanishing (`as_panel`, ported from ctdcast).
24
+ - **Coverage floor raised** ([#106](https://github.com/ocean-uhh/oceanarray/pull/106)) from 38% to 58%: `main` and this branch both measure 59% unit coverage, so the CI `--cov-fail-under` gate is ratcheted to one point below.
25
+ - **Units tables come from the shared report layer**: the vendored layer is re-copied from ctdcast `f2af1d8`, where `units_display.py` became `units.py` + `units_tables.py` (canonical spellings, accepted aliases with factors, display labels, keyed by CF `standard_name`). `oceanarray.config.unit_tables` holds oceanarray's differences from those tables (N² stored as `s-2`; the `ml l-1`, `mL/L` and `s⁻²` spellings) and `unit_label()`, the display entry point the plotters now call. The storage pass is `processors.units.to_canonical_units`. It accepts the same spellings as before for every registry quantity (N² aside, below), still takes each variable's canonical spelling from `parameters.VARIABLES`, still raises on a missing units attribute, and still records `units_converted_from` / `units_conversion_factor` on a conversion; the dune2 goldens are byte-identical.
26
+ - **Plot-axis units derived from the registry through the pipeline** ([#107](https://github.com/ocean-uhh/oceanarray/pull/107)): `parameters.vunit`/`vlabel` now format each variable's canonical CF `units` through `unit_label` (`degree_Celsius` → `°C`), so every axis/colorbar label is produced by the one display rule; the duplicate `label_units` column is removed from `VARIABLES`. The attitude/engineering variables `pitch`, `roll`, `heading`, `tilt`, `current_direction`, `bin_pressure` are registered (canonical CF `degree`/`dbar`), and the reader spellings `degrees`/`volts` are accepted as aliases of `degree`/`V`; the storage pass rewrites a stored `degrees` to `degree` at factor 1. Rendered labels are unchanged.
27
+ - **Derived-quantity unit guard** ([#107](https://github.com/ocean-uhh/oceanarray/pull/107)): a plot whose output unit is computed from a source variable (displacement in km from velocity, height-above-seabed in m from pressure, instrument spacing in dbar, temperature PSD) warns via `unit_tables.warn_if_not_canonical` when the source variable does not carry the canonical unit the derivation assumes. Silent on every oceanarray-written file (the storage pass guarantees canonical units); it catches a foreign or hand-edited file the derivation would otherwise mislabel.
28
+ - **N² keeps the spelling it arrives with**: `s-2` and `rad2 s-2` are both accepted and neither is rewritten into the other (`rad2 s-2` used to be refused), so N² is the one quantity whose stored spelling can differ between files.
29
+ - **Legacy vocabulary files moved and renamed**: `config/OS1_var_names.yaml`, `config/OS1_sensor_attrs.yaml` and `legacy/OS1_vocab_attrs.yaml` are now `legacy/OS1_variable_names.yaml`, `legacy/OS1_sensor_attributes.yaml` and `legacy/OS1_variable_attributes.yaml`, beside the legacy `convertOS.py` that takes them as inputs. No other oceanarray code reads them; the wheel no longer ships them.
30
+ - **Report figure layout** ([#110](https://github.com/ocean-uhh/oceanarray/pull/110)): a single-tier current rose (one QC tier, no magnetic panel) renders as a third-slot circle centred in whitespace instead of a full-slot-width square; the knockdown-displacement figure reserves left margin for its pressure y-labels so a deep mooring's four-digit dbar labels no longer clip. The unreachable `GRID_COMBINED_HYDRO` grid profile is removed (T-S stays its own section).
31
+ - **`°` accepted as a degree spelling** ([#110](https://github.com/ocean-uhh/oceanarray/pull/110)): the storage pass accepts the `°` symbol as the canonical `degree` (factor 1) for attitude variables. `deg` is not accepted here — it is scoped to latitude/longitude in the vendored unit tables and arrives, scoped, at the next vendored sync.
32
+ - **Report layer re-vendored from ctdcast v0.4.0** ([#111](https://github.com/ocean-uhh/oceanarray/pull/111)): the `degree`/`degrees`/`°` alias moves into the vendored family tables (the duplicate package-side copy is removed; unit resolution is unchanged). The array-map graticule gains edge labels drawn inside the west/south edges, a bottom-right scale bar, and antimeridian handling for basin-scale tracks.
33
+ - **ADCP bin pressures are tilt-corrected for knock-down** ([#112](https://github.com/ocean-uhh/oceanarray/pull/112)): `compute_adcp_bin_pressure` reduces each bin's vertical range by `cos(θ)` (θ = instrument tilt from pitch/roll, `arccos(cos P_true·cos R)`) before converting to pressure, so a knocked-down profiler's bins are placed at their true depth; `bin_pressure` gains `tilt_correction` / `tilt_definition` attributes. When the firmware recorded earth coordinates with bin mapping on (RDI `EX` command), it has already tilt-placed the bins, so the correction is **not** applied (`tilt_correction = "none (firmware bin mapping)"`). Every current UHH deployment is earth + bin-mapping, so stored outputs are unchanged; the correction is exercised only by beam-coordinate input. Stage 1 surfaces `firmware_coordinate_system` / `firmware_bin_mapping` from the raw metadata for the guard.
34
+
35
+ ### Added
36
+
37
+ - **Readers for files already processed by their originator** ([#108](https://github.com/ocean-uhh/oceanarray/pull/108)): `file_type: oceansites` (OceanSITES 1.3 netCDF, and the OSNAP variant with variables on `TIME`) and `file_type: rodb` (RAPID/BODC `.microcat`, `.edt`, `.lowedt`), in `oceanarray.tools.readers` (`read_oceansites`, `read_rodb`). Variables are renamed to oceanarray names; the originator's QC flags are kept as `<name>_qc_originator`; the originator's metadata as `originator_*` attributes. Velocities are geographic, so Stage 3 applies no rotation and no second magnetic declination (`originator_magnetic_declination`). New instrument class `currentmeter` for a processed point current meter. Tested on trimmed real OSNAP files (WHOI, GEOMAR, Scripps, RODB) in `tests/fixtures/raw/osnap/`.
38
+ - **`units_override`** ([#108](https://github.com/ocean-uhh/oceanarray/pull/108)) per instrument in the mooring YAML corrects a file whose units attribute is wrong; Stage 1 refuses an imported (`oceansites` / `rodb`) instrument whose values fall outside the registry's valid range for the stated units, naming this key.
39
+ - **`stack: false`** ([#108](https://github.com/ocean-uhh/oceanarray/pull/108)) per instrument in the mooring YAML keeps an instrument out of the stack and grid while it is still processed through stages 1-3 and reported (reference data); the stack names it in an `instruments_excluded` attribute. A low-passed file (`originator_low_passed`, e.g. RODB `.lowedt`) reaching the stack without it is omitted with an error naming the key.
40
+ - Unit spellings accepted: `decibar`, `meter/second`, `meter`, `psu` (practical salinity only), and RODB `cm s-1` (converted ×0.01 to `m s-1`).
41
+
42
+ ### Deprecated
43
+
44
+ - `oceanarray.processors.units.canonicalise_units` → `to_canonical_units`, and `oceanarray.processors.units.format_units` → `oceanarray.config.unit_tables.unit_label`. The old names warn and are removed in 0.6.0.
45
+ - `oceanarray.parameters.UNIT_ALIASES` and `VARIABLE_UNIT_ALIASES`: the spellings now live in the shared units tables (`oceanarray.config.unit_tables.TABLES`, with `PSU` / `NTU` scoped by CF `standard_name`). Both names still resolve, rebuilt from those tables, with a warning; removed in 0.6.0.
46
+
47
+ ### Breaking changes
48
+
49
+ - None. The NetCDF outputs and the public API (`oceanarray` CLI, `from oceanarray.reports import MooringReport`) are unchanged. The report HTML changes (masthead nav, inventory-table layout and type labels, `source:` captions); the committed report goldens are rebaselined to match.
50
+
51
+ ## [0.5.0] — 2026-10-12
52
+
53
+ ### Added
54
+
55
+ - **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.
56
+
57
+ ### Changed
58
+
59
+ - **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/`.
60
+ - **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`).
61
+ - **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`).
62
+
63
+ - **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.
64
+ - **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.
65
+ - **`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.
66
+ - **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.
67
+ - **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.
68
+
69
+ ### Breaking changes
70
+
71
+ - **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`.
72
+ - **`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.
73
+ - **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.
74
+ - **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.
75
+
76
+ - **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.
77
+ - **`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.
78
+ - **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`).
79
+
80
+ ### Known issues
81
+
82
+ - **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.
83
+ - **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.
84
+
85
+ ## [0.4.0] — 2026-09-08
86
+
87
+ ### Added
88
+
89
+ - **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.
90
+ - **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).
91
+ - **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.
92
+ - **`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.
93
+ - **Zenodo DOI** ([#68](https://github.com/ocean-uhh/oceanarray/pull/68)): concept-DOI badge in the README and `CITATION.cff`.
94
+ - A hosted, clickable dune2 example report suite in the docs ([#82](https://github.com/ocean-uhh/oceanarray/pull/82)).
95
+
96
+ ### Changed
97
+
98
+ - **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)).
99
+ - **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)).
100
+ - **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)).
101
+
102
+ ### Fixed
103
+
104
+ - 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)).
105
+ - 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)).
106
+ - `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)).
107
+
108
+ ### Breaking changes
109
+
110
+ - **`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.
111
+ - **`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.
112
+ - **Python 3.9 dropped** ([#85](https://github.com/ocean-uhh/oceanarray/pull/85)): the minimum supported version is now 3.10.
113
+ - 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.
114
+
115
+ ---
116
+
117
+ ## [0.3.0] — 2026-08-11
118
+
119
+ ### Breaking changes
120
+
121
+ - **`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 ...`.
122
+ - **`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.
123
+
124
+ ### Bug fixes
125
+
126
+ - **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.
127
+
128
+ ### Refactoring
129
+
130
+ - **`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`.
131
+ - **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`).
132
+
133
+ ### Documentation
134
+
135
+ - 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.
136
+
137
+ ### Tests
138
+
139
+ - 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)).
140
+
141
+ ---
142
+
143
+ ## [0.2.0] — 2026-08-07
144
+
145
+ ### Breaking changes
146
+
147
+ - **`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 ...`.
148
+ - **`--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).
149
+ - **`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.).
150
+ - **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.
151
+
152
+ ### New features
153
+
154
+ - **`--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`).
155
+ - **`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.
156
+ - **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).
157
+ - **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.
158
+ - **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.
159
+
160
+ ### Bug fixes
161
+
162
+ - **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.
163
+ - **Plot regularisation** ([#50](https://github.com/ocean-uhh/oceanarray/pull/50)): fixed irregular time-axis sampling in instrument report figures.
164
+ - **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.
165
+
166
+ ### Deprecations
167
+
168
+ - **`oceanarray stack`**: deprecated in favour of `oceanarray process MOORING --stage stack`. Emits `DeprecationWarning`. Will be removed in v0.3.0.
169
+ - **`oceanarray grid`**: deprecated in favour of `oceanarray process MOORING --stage grid`. Emits `DeprecationWarning`. Will be removed in v0.3.0.
170
+ - `file_type: rbr-hex-oa` remapped automatically to `rbr-hex` with a `DeprecationWarning`; update mooring YAMLs.
171
+ - `file_type: sbe-asc` remapped automatically to `sbe-ascii`.
172
+
173
+ ### Refactoring
174
+
175
+ - Single-source variable registries in `parameters.py`; `validation.py` derives from it ([#51](https://github.com/ocean-uhh/oceanarray/pull/51)).
176
+ - 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)).
177
+ - Type annotations backfilled on `hydrographic.py` and `temporal.py`; two ANN per-file-ignores removed from `pyproject.toml`.
178
+
179
+ ### Tests
180
+
181
+ - Integration chain tests (stage1 → stage2 → stage3 → stack → grid) over committed `dune2_1_2026` fixtures ([#60](https://github.com/ocean-uhh/oceanarray/pull/60)).
182
+ - CI: integration job now installs seasenselib from PyPI; Windows and macOS unit jobs run seasenselib-free.
183
+
184
+ ---
185
+
186
+ ## [0.1.0] — 2026-07-27
187
+
188
+ First public release.
189
+
190
+ ### Processing pipeline
191
+
192
+ - **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.
193
+ - **Stage 2** — deployment trimming (YAML `deployment_time`/`recovery_time`) and linear clock-drift correction from recovery timestamps.
194
+ - **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`.
195
+
196
+ ### Mooring-level commands
197
+
198
+ - `oceanarray stack` — resample all instruments to a common time axis, stack into a single `(time, N_LEVELS)` dataset ordered deep-first.
199
+ - `oceanarray grid` — linearly interpolate the stacked dataset onto a regular pressure grid (`--pmin`, `--pmax`, `--dp`).
200
+
201
+ ### Reporting
202
+
203
+ - `oceanarray report` — self-contained HTML reports (all figures base64-embedded, offline-readable):
204
+ - Mooring summary: deployment metadata, instrument pipeline status, QC flag breakdown, clock corrections, knockdown figures, clock alignment check.
205
+ - Per-instrument pages (`--instruments`): full time series with QC markers, T-S diagram, current roses, data histograms, QC table, scalar metadata.
206
+ - Stack report (`--stack`): pressure/T/S/velocity time series, T-S diagram, current roses, spacing histogram.
207
+ - Grid report (`--grid`): T/S/density pcolormesh, N², velocity sections, T-S diagram, power spectra.
208
+ - Array report (`--array`): position map, summary table with clickable links to mooring reports.
209
+
210
+ ### CLI
211
+
212
+ - `oceanarray process` — run stage 1, 2, and/or 3 for a mooring or a single instrument (`--serial`).
213
+ - `oceanarray run` — complete pipeline in one command (process + stack + grid + report).
214
+ - `oceanarray validate` — check mooring YAML for missing fields and unknown instrument types.
215
+ - `oceanarray list` — print accepted `instrument:` names and `file_type:` values.
216
+ - `oceanarray logsheet` — generate PDF logsheets from YAML instrument inventory.
217
+
218
+ ### Logsheets
219
+
220
+ - `oceanarray logsheet` subcommand generates LaTeX-rendered PDF deployment logsheets from a cruise configuration YAML.
221
+
222
+ ### Notable design choices
223
+
224
+ - Data provenance: all processing parameters (QC thresholds, declination value, transformation matrix) stored as NetCDF attributes so any file can be reprocessed exactly from itself.
225
+ - Discrete colorbars throughout (≤ 20 levels, `BoundaryNorm`).
226
+ - CF-convention variable names and standard names throughout; OceanSITES QC flag values.
227
+ - `seasenselib` is used for raw file reading but is a separate install (`pip install seasenselib --no-deps` — see installation docs).
@@ -7,8 +7,8 @@ authors:
7
7
  affiliation: University of Hamburg, Bundesstraße 53, 20146 Hamburg, Germany
8
8
  title: oceanarray
9
9
  doi: 10.5281/zenodo.21890564
10
- version: 0.4.0
11
- date-released: 2026-09-08
10
+ version: 0.5.1
11
+ date-released: 2026-10-23
12
12
  url: https://github.com/ocean-uhh/oceanarray
13
13
  repository-code: https://github.com/ocean-uhh/oceanarray
14
14
  license: MIT
@@ -79,7 +79,21 @@ For all other bugs:
79
79
  - Why it would be useful to other users (not just your specific cruise).
80
80
  - Whether you are willing to implement it yourself.
81
81
 
82
- Keep in mind that oceanarray is designed for reproducible processing of moored array data. Features that require cruise-specific raw data, add heavy new dependencies, or break the CF-NetCDF output contract are unlikely to be merged.
82
+ ### Scope
83
+
84
+ oceanarray **processes moored-array observations**: raw instrument files from a mooring (MicroCATs, RBRs, Nortek and RDI current meters and ADCPs, SBE 16/56, Seapoint, …) → CF-NetCDF at each stage — stage 1 (raw → NetCDF), stage 2 (deployment window, clock), stage 3 (QC, velocity rotation, calibration-dip offsets applied) — then a stack on a common time axis and a grid on pressure levels, each step documented in an HTML report. The OceanSITES export of the stacked and gridded products is the next in-scope step.
85
+
86
+ **Fixed — not open to variation:** the output contract. Variable names, CF standard names and the canonical unit spellings come from one registry (`config/parameters.py`) and are the same in every file the package writes; QC flags follow the QARTOD/OceanSITES vocabulary; every processing parameter is recorded in the output's attributes so a file can be reprocessed from itself. Contributions that change these change every user's files, and are discussed first, as an issue.
87
+
88
+ **Open — alternative methods welcome, as selectable options with the default unchanged:**
89
+
90
+ - **Gridding.** The grid step is where the method choices are made — today linear interpolation in pressure onto a fixed `dp` grid, with σ₀ targets for isopycnal products. Alternatives: a **PCHIP spline**; the **RAPID climatological-gradient interpolation** (`tools/rapid_interp.py`, written but **not yet integrated** into `grid.py`); and bounds handling above the shallowest instrument — **extrapolate to the surface**, clip, or mask. All welcome as named methods the user picks in the config, each recording its name and parameters in the output.
91
+ - **Corrections to individual instruments.** How calibration-dip offsets and other per-instrument corrections (drift, pressure-sensor offset) are applied in stage 3 — constant, linear in time, pre/post weighted — is a method choice; the *derivation* of caldip offsets stays in `caldip`, oceanarray applies its output.
92
+ - **QC tests.** New QARTOD-style tests or thresholds, as long as the flags land in the existing `_qc` companions with their thresholds recorded.
93
+ - **Diagnostic figures and report panels.** New figures are welcome, and the report is meant to let a user choose their own selection of panels per page (a config-driven profile); contributions that make that selection easier are in scope.
94
+ - **Readers.** Instrument readers live in `seasenselib`; oceanarray's stage 1 dispatches on the file type (`config/parameters.INSTRUMENT_FILE_TYPES`) and keeps only a small set of its own legacy readers (`tools/readers.py`: RODB and the old Nortek CSV). A reader for an instrument `seasenselib` does not cover is welcome — but write it in `seasenselib` first and add the file type here; a reader that only oceanarray would ever use can live in `tools/readers.py`. (Where exactly that line is drawn is not written down yet — ask.)
95
+
96
+ **Out of scope, because a sibling owns it:** shipboard CTD processing (`ctdcast`); deriving calibration-dip offsets (`caldip`); glider data (`glidertest`, `seagliderOG1`); transport and AMOC estimates from the gridded products (`AMOCatlas`); general-purpose plotting. Also out: features that need cruise-specific raw data in the repository, heavy new dependencies, or that break the CF-NetCDF contract. If you are unsure whether an idea fits, open an issue describing it rather than deciding alone.
83
97
 
84
98
  ---
85
99
 
@@ -89,10 +103,10 @@ Keep in mind that oceanarray is designed for reproducible processing of moored a
89
103
 
90
104
  | Layer | Modules | Role |
91
105
  |-------|---------|------|
92
- | Tier 1 | `tools/`, `utilities.py` | Pure functions, no side effects |
106
+ | Tier 1 | `tools/`, `writers/`, `utilities.py`, `inspect.py` | Low-level I/O and pure functions — raw-file readers, the single netCDF writer, dataset inspection |
93
107
  | Tier 2 | `processors/stage1.py` … `processors/grid.py` | Processing orchestrators — read, transform, write CF-NetCDF |
94
108
  | Tier 3 | `cli.py` | Entry point — argument parsing, subcommand dispatch |
95
- | — | `plotters/`, `report/` | Visualisation and HTML report generation |
109
+ | — | `plotters/`, `reports/` | Visualisation and HTML report generation |
96
110
  | — | `analysis/` | Science utilities (filtering, isopycnals, QC) |
97
111
  | — | `config/` | Parameters, variable registry, YAML validation |
98
112
 
@@ -117,7 +131,7 @@ PDF report output (WeasyPrint, which needs native pango/cairo libraries), use
117
131
 
118
132
  1. Fork the repository and create a feature branch from `main`.
119
133
  2. Make your changes, following the conventions below.
120
- 3. Run `ruff check . --fix` and then `pytest` — all tests must pass.
134
+ 3. Run `ruff check . --fix` and `ruff format .`, then `pytest` — all tests must pass. (`ruff format` owns line wrapping, which is why `E501` is ignored in `pyproject.toml`.)
121
135
  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
136
 
123
137
  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.)
@@ -135,8 +149,8 @@ Co-authored-by: Name <email@example.com>
135
149
  - **Docstrings**: NumPy style on every public function and class. Include `Parameters`, `Returns`, and `Raises` sections. Period at the end.
136
150
  - **Type annotations**: all public function arguments and return values.
137
151
  - **Lint**: `ruff check .` must be clean. No bare `except:`. No suppressed warnings without a comment explaining why.
138
- - **Units**: never strip or assume units. Use `gsw` for all seawater property calculations.
139
- - **Plot style**: discrete colorbars (`BoundaryNorm`, ≤ 20 levels); call `plt.style.use(str(P.MPLSTYLE))` at the start of every plot function.
152
+ - **Units**: every registered variable carries the registry's canonical spelling (`config/parameters.VARIABLES[var]["units"]`), and that spelling is identical in every file the package writes — except N², kept as `s-2` or `rad2 s-2` as it arrives (`config/unit_tables.UNIT_SPELLINGS_KEPT`). The pipeline rewrites known spellings through the shared units tables (`config/unit_tables.TABLES`) and refuses unknown ones. A new spelling is added **with evidence** — a reader that emits it — never from memory: to `config/unit_tables.UNIT_ALIAS_EXTRAS` if only oceanarray's readers emit it, or upstream in ctdcast's vendored `units_tables.py` if it belongs to the family. A mass↔volume conversion is never a scalar alias. Use `gsw` for all seawater property calculations.
153
+ - **Plot style**: discrete colorbars (`BoundaryNorm`, ≤ 20 levels). Report figures are styled at one choke point — `reports/_encode.render_b64` applies the vendored `report.mplstyle` and `reports/_slots.render` draws each figure at its slot width — so a report plotter does not call `plt.style.use` itself.
140
154
  - **Data provenance**: store all processing parameters (thresholds, coefficients) in NC output attributes so any file can be reprocessed exactly from itself.
141
155
  - **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.
142
156
 
@@ -150,7 +164,9 @@ pytest tests/unit -m "not slow and not needs_seasenselib" # without seasenselib
150
164
  pytest --cov=oceanarray --cov-report=term-missing -q # with coverage
151
165
  ```
152
166
 
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/`.
167
+ 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.
168
+
169
+ Fixtures are **real instrument data** — the committed `dune2` raw/proc set in `tests/fixtures/`, trimmed down — not synthetic mocks; a new reader path gets a small real file. Report HTML is **golden-tested** (`tests/fixtures/golden/`, rendered and compared by `tests/unit/test_report_golden.py`): a change to the rendered output is re-baselined (`REBASELINE_GOLDEN=1 pytest`) only after a before/after look, never silently, so the intended change *is* the reviewable diff.
154
170
 
155
171
  ---
156
172
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: oceanarray
3
- Version: 0.4.0
3
+ Version: 0.5.1
4
4
  Summary: Multi-stage processing pipeline for moored oceanographic observations: raw instrument files to QC-flagged CF-compliant NetCDF with automated HTML reports.
5
5
  Maintainer-email: Eleanor Frajka-Williams <eleanorfrajka@gmail.com>
6
6
  License: MIT License
@@ -35,10 +35,10 @@ Classifier: Intended Audience :: Science/Research
35
35
  Classifier: Topic :: Scientific/Engineering :: Oceanography
36
36
  Classifier: License :: OSI Approved :: MIT License
37
37
  Classifier: Programming Language :: Python :: 3 :: Only
38
- Classifier: Programming Language :: Python :: 3.10
39
38
  Classifier: Programming Language :: Python :: 3.11
40
39
  Classifier: Programming Language :: Python :: 3.12
41
- Requires-Python: >=3.10
40
+ Classifier: Programming Language :: Python :: 3.13
41
+ Requires-Python: >=3.11
42
42
  Description-Content-Type: text/markdown
43
43
  License-File: LICENSE
44
44
  Requires-Dist: numpy>=1.23
@@ -63,6 +63,7 @@ Requires-Dist: pytest-cov>=4.1; extra == "test"
63
63
  Provides-Extra: docs
64
64
  Requires-Dist: sphinx>=7.2; extra == "docs"
65
65
  Requires-Dist: sphinx-rtd-theme>=2.0; extra == "docs"
66
+ Requires-Dist: sphinx-argparse>=0.4; extra == "docs"
66
67
  Requires-Dist: myst-nb>=1.0; extra == "docs"
67
68
  Requires-Dist: nbsphinx>=0.9; extra == "docs"
68
69
  Requires-Dist: pypandoc>=1.11; extra == "docs"
@@ -86,6 +87,8 @@ Dynamic: license-file
86
87
 
87
88
  Python tools for processing moored oceanographic array observations from raw instrument files to quality-controlled, CF-compliant NetCDF.
88
89
 
90
+ It covers a single mooring's instruments — stages 1–3, stacking, and pressure gridding, each documented in an HTML report. Deriving calibration-dip offsets is handled by `caldip`, and shipboard CTD processing by `ctdcast`.
91
+
89
92
  **Documentation**: https://ocean-uhh.github.io/oceanarray/
90
93
 
91
94
  ## Installation
@@ -102,7 +105,7 @@ uv pip install oceanarray
102
105
 
103
106
  This pulls in `seasenselib` (used to read raw instrument files in stage 1) automatically.
104
107
 
105
- Python 3.10–3.12 is supported. See the [installation guide](https://ocean-uhh.github.io/oceanarray/installation.html) for isolated-environment (conda / venv / uv) and from-source options.
108
+ Python 3.11–3.13 is supported. See the [installation guide](https://ocean-uhh.github.io/oceanarray/installation.html) for isolated-environment (conda / venv / uv) and from-source options.
106
109
 
107
110
  ## Quick start
108
111
 
@@ -9,6 +9,8 @@
9
9
 
10
10
  Python tools for processing moored oceanographic array observations from raw instrument files to quality-controlled, CF-compliant NetCDF.
11
11
 
12
+ It covers a single mooring's instruments — stages 1–3, stacking, and pressure gridding, each documented in an HTML report. Deriving calibration-dip offsets is handled by `caldip`, and shipboard CTD processing by `ctdcast`.
13
+
12
14
  **Documentation**: https://ocean-uhh.github.io/oceanarray/
13
15
 
14
16
  ## Installation
@@ -25,7 +27,7 @@ uv pip install oceanarray
25
27
 
26
28
  This pulls in `seasenselib` (used to read raw instrument files in stage 1) automatically.
27
29
 
28
- Python 3.10–3.12 is supported. See the [installation guide](https://ocean-uhh.github.io/oceanarray/installation.html) for isolated-environment (conda / venv / uv) and from-source options.
30
+ Python 3.11–3.13 is supported. See the [installation guide](https://ocean-uhh.github.io/oceanarray/installation.html) for isolated-environment (conda / venv / uv) and from-source options.
29
31
 
30
32
  ## Quick start
31
33