oceanarray 0.4.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.
Files changed (314) hide show
  1. {oceanarray-0.4.0 → oceanarray-0.5.0}/.github/workflows/docs.yml +3 -4
  2. {oceanarray-0.4.0 → oceanarray-0.5.0}/.github/workflows/docs_deploy.yml +3 -4
  3. {oceanarray-0.4.0 → oceanarray-0.5.0}/.github/workflows/pypi.yml +3 -3
  4. {oceanarray-0.4.0 → oceanarray-0.5.0}/.github/workflows/tests.yml +9 -12
  5. {oceanarray-0.4.0 → oceanarray-0.5.0}/CHANGELOG.md +34 -0
  6. {oceanarray-0.4.0 → oceanarray-0.5.0}/CITATION.cff +2 -2
  7. {oceanarray-0.4.0/oceanarray.egg-info → oceanarray-0.5.0}/PKG-INFO +4 -4
  8. {oceanarray-0.4.0 → oceanarray-0.5.0}/README.md +1 -1
  9. oceanarray-0.5.0/VENDORED.txt +9 -0
  10. oceanarray-0.5.0/docs/source/_static/demo/dune2/dune2_1_2026_grid_report.html +939 -0
  11. oceanarray-0.5.0/docs/source/_static/demo/dune2/dune2_1_2026_report.html +9281 -0
  12. oceanarray-0.5.0/docs/source/_static/demo/dune2/dune2_1_2026_stack_report.html +1549 -0
  13. oceanarray-0.5.0/docs/source/_static/demo/dune2/instrument/dune2_1_2026_2941_report.html +1377 -0
  14. oceanarray-0.5.0/docs/source/_static/demo/dune2/instrument/dune2_1_2026_9920_report.html +2138 -0
  15. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/clock_offset.rst +2 -2
  16. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/installation.rst +1 -2
  17. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/methods/concatenation.rst +1 -1
  18. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/methods/standardisation.rst +5 -5
  19. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/migration.rst +26 -0
  20. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/oceanarray.rst +9 -5
  21. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/quickstart.rst +1 -1
  22. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/reports.rst +9 -6
  23. oceanarray-0.5.0/notebooks/demo_mooring.ipynb +363 -0
  24. oceanarray-0.5.0/notebooks/legacy/README.md +21 -0
  25. {oceanarray-0.4.0/notebooks → oceanarray-0.5.0/notebooks/legacy}/demo_instrument.ipynb +2 -6
  26. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/__init__.py +6 -0
  27. oceanarray-0.5.0/oceanarray/_version.py +1 -0
  28. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/cli.py +9 -8
  29. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/config/parameters.py +110 -18
  30. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/config/report_tokens.py +3 -2
  31. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/config/validation.py +155 -1
  32. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/paths.py +5 -1
  33. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/plotters/animation.py +2 -1
  34. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/plotters/current.py +13 -8
  35. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/plotters/diagnostic.py +16 -10
  36. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/plotters/helpers.py +5 -3
  37. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/plotters/hydrography.py +2 -1
  38. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/plotters/timeseries.py +6 -3
  39. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/processors/__init__.py +38 -1
  40. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/processors/caldip.py +4 -2
  41. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/processors/grid.py +38 -50
  42. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/processors/qc.py +44 -41
  43. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/processors/stack.py +64 -13
  44. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/processors/stage1.py +41 -84
  45. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/processors/stage2.py +22 -49
  46. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/processors/stage3.py +25 -20
  47. oceanarray-0.5.0/oceanarray/processors/units.py +263 -0
  48. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/_array.py +3 -2
  49. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/_css.py +54 -1
  50. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/_encode.py +11 -2
  51. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/_env.py +30 -5
  52. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/_grid.py +18 -9
  53. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/_html_helpers.py +98 -179
  54. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/_instrument.py +25 -25
  55. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/_manifest.py +109 -13
  56. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/_mooring.py +6 -6
  57. oceanarray-0.5.0/oceanarray/reports/_navs.py +198 -0
  58. oceanarray-0.5.0/oceanarray/reports/_nc_tables.py +176 -0
  59. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/_pdf.py +4 -2
  60. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/_recovery_table.py +3 -2
  61. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/_stack.py +12 -11
  62. oceanarray-0.5.0/oceanarray/reports/templates/_nav.html +24 -0
  63. oceanarray-0.5.0/oceanarray/reports/templates/_nc_coords.html +15 -0
  64. oceanarray-0.5.0/oceanarray/reports/templates/_nc_globals.html +21 -0
  65. oceanarray-0.5.0/oceanarray/reports/templates/_nc_scalars.html +24 -0
  66. oceanarray-0.5.0/oceanarray/reports/templates/_nc_var_macros.html +32 -0
  67. oceanarray-0.5.0/oceanarray/reports/templates/_nc_variables.html +20 -0
  68. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/templates/base.html +14 -2
  69. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/tools/__init__.py +0 -1
  70. oceanarray-0.5.0/oceanarray/writers/__init__.py +13 -0
  71. oceanarray-0.5.0/oceanarray/writers/netcdf.py +364 -0
  72. {oceanarray-0.4.0 → oceanarray-0.5.0/oceanarray.egg-info}/PKG-INFO +4 -4
  73. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray.egg-info/SOURCES.txt +26 -16
  74. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray.egg-info/scm_file_list.json +26 -16
  75. oceanarray-0.5.0/oceanarray.egg-info/scm_version.json +8 -0
  76. {oceanarray-0.4.0 → oceanarray-0.5.0}/pyproject.toml +9 -5
  77. oceanarray-0.5.0/scripts/check_vendored.py +111 -0
  78. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/fixtures/golden/dune2/dune2_1_2026_grid_report.html +316 -85
  79. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/fixtures/golden/dune2/dune2_1_2026_report.html +86 -4
  80. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/fixtures/golden/dune2/dune2_1_2026_stack_report.html +639 -320
  81. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/fixtures/golden/dune2/instrument/dune2_1_2026_2941_report.html +394 -154
  82. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/fixtures/golden/dune2/instrument/dune2_1_2026_9920_report.html +734 -478
  83. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/fixtures/proc/dune2_1_2026/aquadopp/dune2_1_2026_9920_stage1.nc +0 -0
  84. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/fixtures/proc/dune2_1_2026/aquadopp/dune2_1_2026_9920_stage2.nc +0 -0
  85. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/fixtures/proc/dune2_1_2026/aquadopp/dune2_1_2026_9920_stage3.nc +0 -0
  86. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/fixtures/proc/dune2_1_2026/dune2_1_2026_grid.nc +0 -0
  87. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/fixtures/proc/dune2_1_2026/dune2_1_2026_stack.nc +0 -0
  88. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/fixtures/proc/dune2_1_2026/microcat/dune2_1_2026_2941_stage1.nc +0 -0
  89. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/fixtures/proc/dune2_1_2026/microcat/dune2_1_2026_2941_stage2.nc +0 -0
  90. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/fixtures/proc/dune2_1_2026/microcat/dune2_1_2026_2941_stage3.nc +0 -0
  91. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/integration/test_stage1_from_raw.py +65 -0
  92. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/integration/test_time_gridding.py +6 -0
  93. oceanarray-0.5.0/tests/unit/test_canonical_units.py +342 -0
  94. oceanarray-0.5.0/tests/unit/test_grid_clamp.py +45 -0
  95. oceanarray-0.5.0/tests/unit/test_nav.py +143 -0
  96. oceanarray-0.5.0/tests/unit/test_nc_tables.py +55 -0
  97. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/unit/test_parameters.py +1 -1
  98. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/unit/test_qc.py +49 -48
  99. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/unit/test_report.py +6 -1
  100. oceanarray-0.5.0/tests/unit/test_stack_omission.py +73 -0
  101. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/unit/test_stage1.py +58 -28
  102. oceanarray-0.5.0/tests/unit/test_unit_label_literals.py +60 -0
  103. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/unit/test_validation.py +132 -1
  104. oceanarray-0.5.0/tests/unit/test_vendored.py +41 -0
  105. oceanarray-0.5.0/tests/unit/test_writers_netcdf.py +453 -0
  106. oceanarray-0.4.0/MIGRATION-BASEDIR.md +0 -188
  107. oceanarray-0.4.0/docs/source/_static/demo/dune2/dune2_1_2026_grid_report.html +0 -684
  108. oceanarray-0.4.0/docs/source/_static/demo/dune2/dune2_1_2026_report.html +0 -1600
  109. oceanarray-0.4.0/docs/source/_static/demo/dune2/dune2_1_2026_stack_report.html +0 -1217
  110. oceanarray-0.4.0/docs/source/_static/demo/dune2/instrument/dune2_1_2026_2941_report.html +0 -1084
  111. oceanarray-0.4.0/docs/source/_static/demo/dune2/instrument/dune2_1_2026_9920_report.html +0 -1827
  112. oceanarray-0.4.0/notebooks/demo_mooring.ipynb +0 -408
  113. oceanarray-0.4.0/notebooks/demo_step1.ipynb +0 -696
  114. oceanarray-0.4.0/notebooks/legacy/README.md +0 -18
  115. oceanarray-0.4.0/oceanarray/_version.py +0 -1
  116. oceanarray-0.4.0/oceanarray/reports/templates/_grid_nc_globals.html +0 -14
  117. oceanarray-0.4.0/oceanarray/reports/templates/_grid_nc_scalars.html +0 -18
  118. oceanarray-0.4.0/oceanarray/reports/templates/_grid_nc_variables.html +0 -30
  119. oceanarray-0.4.0/oceanarray/reports/templates/_instrument_nc_globals.html +0 -14
  120. oceanarray-0.4.0/oceanarray/reports/templates/_instrument_nc_scalars.html +0 -19
  121. oceanarray-0.4.0/oceanarray/reports/templates/_instrument_nc_variables.html +0 -30
  122. oceanarray-0.4.0/oceanarray/reports/templates/_stack_nc_dims.html +0 -11
  123. oceanarray-0.4.0/oceanarray/tools/writers.py +0 -103
  124. oceanarray-0.4.0/oceanarray.egg-info/scm_version.json +0 -8
  125. oceanarray-0.4.0/tests/unit/test_writers.py +0 -100
  126. {oceanarray-0.4.0 → oceanarray-0.5.0}/.gitattributes +0 -0
  127. {oceanarray-0.4.0 → oceanarray-0.5.0}/.github/ISSUE_TEMPLATE.md +0 -0
  128. {oceanarray-0.4.0 → oceanarray-0.5.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  129. {oceanarray-0.4.0 → oceanarray-0.5.0}/.github/dependabot.yml +0 -0
  130. {oceanarray-0.4.0 → oceanarray-0.5.0}/.gitignore +0 -0
  131. {oceanarray-0.4.0 → oceanarray-0.5.0}/CONTRIBUTING.md +0 -0
  132. {oceanarray-0.4.0 → oceanarray-0.5.0}/LICENSE +0 -0
  133. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/Makefile +0 -0
  134. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/environment.yml +0 -0
  135. {oceanarray-0.4.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
  136. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/_static/array_processing.png +0 -0
  137. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/_static/array_processing_v2.png +0 -0
  138. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/_static/code/3_beam_transformation.py +0 -0
  139. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/_static/code/auto_filt.m +0 -0
  140. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/_static/code/hydro_grid.m +0 -0
  141. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/_static/code/microcat2rodb_2.m +0 -0
  142. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/_static/code/microcat2rodb_3.m +0 -0
  143. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/_static/code/microcat_apply_cal.m +0 -0
  144. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/_static/code/microcat_apply_cal_plus.m +0 -0
  145. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/_static/code/microcat_raw2use_003.m +0 -0
  146. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/_static/code/mooring_interp_wb2_3_5.m +0 -0
  147. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/_static/css/custom.css +0 -0
  148. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/_static/github_solo_workflow.png +0 -0
  149. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/_static/github_workflow2.png +0 -0
  150. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/_static/instrument_processing.png +0 -0
  151. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/_static/instrument_processing_v2.png +0 -0
  152. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/_static/instrument_processing_v4.png +0 -0
  153. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/_static/instrument_processing_v5.png +0 -0
  154. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/_static/instrument_processing_v6.png +0 -0
  155. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/_static/logo.png +0 -0
  156. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/_static/mooring_processing.png +0 -0
  157. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/_static/mooring_processing_V2.png +0 -0
  158. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/_static/mooring_processing_v3.png +0 -0
  159. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/_static/mooring_processing_v4.png +0 -0
  160. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/_static/oceanarray_grid_report.png +0 -0
  161. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/_static/oceanarray_icon.png +0 -0
  162. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/_static/oceanarray_instrument_report.png +0 -0
  163. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/_static/oceanarray_report_header.png +0 -0
  164. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/_static/oceanarray_stack_report.png +0 -0
  165. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/_static/rotary_spectrum_plan.rst +0 -0
  166. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/calibration_dips.rst +0 -0
  167. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/cli_reference.rst +0 -0
  168. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/conf.py +0 -0
  169. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/directory_structure.rst +0 -0
  170. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/file_naming_conventions.rst +0 -0
  171. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/index.rst +0 -0
  172. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/legacy.rst +0 -0
  173. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/methods/acquisition.rst +0 -0
  174. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/methods/auto_qc.rst +0 -0
  175. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/methods/calibration.rst +0 -0
  176. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/methods/conversion.rst +0 -0
  177. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/methods/multisite_merging.rst +0 -0
  178. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/methods/nortek_coordinate_transform.rst +0 -0
  179. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/methods/time_gridding.rst +0 -0
  180. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/methods/trimming.rst +0 -0
  181. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/methods/vertical_gridding.rst +0 -0
  182. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/oceanSITES_manual.rst +0 -0
  183. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/oceanarray_format.rst +0 -0
  184. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/processing_framework.rst +0 -0
  185. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/project_structure.md +0 -0
  186. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/roadmap.rst +0 -0
  187. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/style_guide.md +0 -0
  188. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/troubleshooting.rst +0 -0
  189. {oceanarray-0.4.0 → oceanarray-0.5.0}/docs/source/yaml_configuration.rst +0 -0
  190. {oceanarray-0.4.0 → oceanarray-0.5.0}/notebooks/demo_climatology.ipynb +0 -0
  191. {oceanarray-0.4.0 → oceanarray-0.5.0}/notebooks/dsE_1_2018_microcat_7518_temperature.png +0 -0
  192. {oceanarray-0.4.0 → oceanarray-0.5.0}/notebooks/legacy/demo_batch_instrument.ipynb +0 -0
  193. {oceanarray-0.4.0/notebooks → oceanarray-0.5.0/notebooks/legacy}/demo_check_clock.ipynb +0 -0
  194. {oceanarray-0.4.0/notebooks → oceanarray-0.5.0/notebooks/legacy}/demo_clock_offset.ipynb +0 -0
  195. {oceanarray-0.4.0 → oceanarray-0.5.0}/notebooks/legacy/demo_instrument_rdb.ipynb +0 -0
  196. {oceanarray-0.4.0 → oceanarray-0.5.0}/notebooks/legacy/demo_mooring_rdb.ipynb +0 -0
  197. {oceanarray-0.4.0/notebooks → oceanarray-0.5.0/notebooks/legacy}/demo_stage1.ipynb +0 -0
  198. {oceanarray-0.4.0/notebooks → oceanarray-0.5.0/notebooks/legacy}/demo_stage2.ipynb +0 -0
  199. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/analysis/__init__.py +0 -0
  200. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/analysis/clock.py +0 -0
  201. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/analysis/hydrographic.py +0 -0
  202. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/analysis/science.py +0 -0
  203. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/analysis/spectral.py +0 -0
  204. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/analysis/temporal.py +0 -0
  205. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/analysis/vector.py +0 -0
  206. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/config/OS1_sensor_attrs.yaml +0 -0
  207. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/config/OS1_var_names.yaml +0 -0
  208. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/config/__init__.py +0 -0
  209. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/config/legacy/project_RAPID.yaml +0 -0
  210. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/config/legacy/rodb_keys.txt +0 -0
  211. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/config/legacy/rodb_keys.yaml +0 -0
  212. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/config/logging.yaml +0 -0
  213. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/config/report.mplstyle +0 -0
  214. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/inspect.py +0 -0
  215. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/legacy/OS1_vocab_attrs.yaml +0 -0
  216. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/legacy/__init__.py +0 -0
  217. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/legacy/caldip.py +0 -0
  218. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/legacy/convertOS.py +0 -0
  219. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/legacy/find_deployment.py +0 -0
  220. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/legacy/mooring_rodb.py +0 -0
  221. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/legacy/process_rodb.py +0 -0
  222. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/legacy/rodb.py +0 -0
  223. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/legacy/tools.py +0 -0
  224. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/logger.py +0 -0
  225. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/plotters/__init__.py +0 -0
  226. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/plotters/_cli_legacy.py +0 -0
  227. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/plotters/primitives.py +0 -0
  228. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/plotters/spectrum.py +0 -0
  229. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/plotters/ts.py +0 -0
  230. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/processors/coordinate.py +0 -0
  231. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/processors/helpers.py +0 -0
  232. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/processors/pressure.py +0 -0
  233. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/__init__.py +0 -0
  234. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/_figdebug.py +0 -0
  235. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/_plots.py +0 -0
  236. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/_report_css.py +0 -0
  237. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/_slots.py +0 -0
  238. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/templates/_grid_history.html +0 -0
  239. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/templates/_instrument_analog_yaml.html +0 -0
  240. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/templates/_instrument_files.html +0 -0
  241. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/templates/_instrument_qc.html +0 -0
  242. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/templates/_instrument_rose_note.html +0 -0
  243. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/templates/_instrument_windows_note.html +0 -0
  244. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/templates/_macros.html +0 -0
  245. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/templates/_mooring_calibration.html +0 -0
  246. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/templates/_mooring_clock_table.html +0 -0
  247. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/templates/_mooring_diagram.html +0 -0
  248. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/templates/_mooring_instruments.html +0 -0
  249. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/templates/_mooring_issues.html +0 -0
  250. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/templates/_mooring_pipeline.html +0 -0
  251. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/templates/_mooring_qc.html +0 -0
  252. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/templates/_mooring_timing.html +0 -0
  253. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/templates/_stack_instr_table.html +0 -0
  254. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/templates/_stack_roses_note.html +0 -0
  255. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/templates/array.html +0 -0
  256. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/templates/grid.html +0 -0
  257. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/templates/instrument.html +0 -0
  258. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/templates/mooring.html +0 -0
  259. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/templates/recovery_table.html +0 -0
  260. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/reports/templates/stack.html +0 -0
  261. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/tools/rapid_interp.py +0 -0
  262. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/tools/readers.py +0 -0
  263. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray/utilities.py +0 -0
  264. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray.egg-info/dependency_links.txt +0 -0
  265. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray.egg-info/entry_points.txt +0 -0
  266. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray.egg-info/requires.txt +0 -0
  267. {oceanarray-0.4.0 → oceanarray-0.5.0}/oceanarray.egg-info/top_level.txt +0 -0
  268. {oceanarray-0.4.0 → oceanarray-0.5.0}/setup.cfg +0 -0
  269. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/conftest.py +0 -0
  270. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/fixtures/caldip/castM4_caldip.nc +0 -0
  271. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/fixtures/proc/MIXSED2026.array.yaml +0 -0
  272. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/fixtures/proc/dune2_1_2026/dune2_1_2026.mooring.yaml +0 -0
  273. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/fixtures/raw/dune2_1_2026/aquadopp/9920_recovery.dat +0 -0
  274. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/fixtures/raw/dune2_1_2026/aquadopp/9920_recovery.hdr +0 -0
  275. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/fixtures/raw/dune2_1_2026/microcat/2941_recovery.asc +0 -0
  276. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/fixtures/regenerate_dune2_microcat.py +0 -0
  277. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/integration/__init__.py +0 -0
  278. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/integration/conftest.py +0 -0
  279. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/integration/test_pipeline.py +0 -0
  280. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/integration/test_readers.py +0 -0
  281. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/integration/test_recovery_table.py +0 -0
  282. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/integration/test_stage1.py +0 -0
  283. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/integration/test_stage2.py +0 -0
  284. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/legacy/__init__.py +0 -0
  285. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/legacy/test_convertOS.py +0 -0
  286. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/legacy/test_mooring_rodb.py +0 -0
  287. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/legacy/test_process_rodb.py +0 -0
  288. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/legacy/test_rodb.py +0 -0
  289. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/test_imports.py +0 -0
  290. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/unit/__init__.py +0 -0
  291. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/unit/test_array.py +0 -0
  292. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/unit/test_caldip.py +0 -0
  293. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/unit/test_cli.py +0 -0
  294. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/unit/test_flag_merge.py +0 -0
  295. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/unit/test_grid_manifest.py +0 -0
  296. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/unit/test_helpers.py +0 -0
  297. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/unit/test_instrument_manifest.py +0 -0
  298. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/unit/test_logger.py +0 -0
  299. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/unit/test_manifest.py +0 -0
  300. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/unit/test_mooring_manifest.py +0 -0
  301. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/unit/test_paths.py +0 -0
  302. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/unit/test_pdf_report.py +0 -0
  303. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/unit/test_plot_guard.py +0 -0
  304. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/unit/test_plotters.py +0 -0
  305. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/unit/test_pressure.py +0 -0
  306. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/unit/test_process_api.py +0 -0
  307. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/unit/test_recovery_table.py +0 -0
  308. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/unit/test_report_golden.py +0 -0
  309. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/unit/test_report_tokens.py +0 -0
  310. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/unit/test_stage2.py +0 -0
  311. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/unit/test_stage3.py +0 -0
  312. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/unit/test_time_gridding.py +0 -0
  313. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/unit/test_tools.py +0 -0
  314. {oceanarray-0.4.0 → oceanarray-0.5.0}/tests/unit/test_utilities.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"
@@ -53,10 +50,10 @@ jobs:
53
50
  integration:
54
51
  runs-on: ubuntu-latest
55
52
  steps:
56
- - uses: actions/checkout@v4
53
+ - uses: actions/checkout@v7
57
54
 
58
55
  - name: Set up Python 3.11
59
- uses: actions/setup-python@v5
56
+ uses: actions/setup-python@v7
60
57
  with:
61
58
  python-version: "3.11"
62
59
  cache: "pip"
@@ -74,10 +71,10 @@ jobs:
74
71
  lint:
75
72
  runs-on: ubuntu-latest
76
73
  steps:
77
- - uses: actions/checkout@v4
74
+ - uses: actions/checkout@v7
78
75
 
79
76
  - name: Set up Python 3.11
80
- uses: actions/setup-python@v5
77
+ uses: actions/setup-python@v7
81
78
  with:
82
79
  python-version: "3.11"
83
80
 
@@ -6,6 +6,40 @@ All notable changes to oceanarray are documented here.
6
6
 
7
7
  ## [Unreleased]
8
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
+
9
43
  ## [0.4.0] — 2026-09-08
10
44
 
11
45
  ### Added
@@ -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.0
11
+ date-released: 2026-10-12
12
12
  url: https://github.com/ocean-uhh/oceanarray
13
13
  repository-code: https://github.com/ocean-uhh/oceanarray
14
14
  license: MIT
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: oceanarray
3
- Version: 0.4.0
3
+ Version: 0.5.0
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
@@ -102,7 +102,7 @@ uv pip install oceanarray
102
102
 
103
103
  This pulls in `seasenselib` (used to read raw instrument files in stage 1) automatically.
104
104
 
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.
105
+ 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
106
 
107
107
  ## Quick start
108
108
 
@@ -25,7 +25,7 @@ uv pip install oceanarray
25
25
 
26
26
  This pulls in `seasenselib` (used to read raw instrument files in stage 1) automatically.
27
27
 
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.
28
+ 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
29
 
30
30
  ## Quick start
31
31
 
@@ -0,0 +1,9 @@
1
+ # sha256 of the report-design files shared across ctdcast, oceanarray and
2
+ # glidertest; ctdcast main 1a7cd91 is the source of truth. Never
3
+ # hand-edit; re-vendor from ctdcast, then: python scripts/check_vendored.py --update
4
+ 0856f12f8f032f8803081e207f1e46b694e68b9a837174960c5bd6fa526370a0 oceanarray/reports/_encode.py
5
+ 6804280ebe2f25b1d958cbf01ddfb8c19b12b423f4650cb8a494a7697bfa96f4 oceanarray/reports/_css.py
6
+ aa57d10b7891164f07b0f4c5345c716934af0a3409859d48dae2387fcce71804 oceanarray/reports/_manifest.py
7
+ 752c4d4245b7ac4b82a63ea7245707c24deae2c088d03bf9bb6ea7a325ce5f1b oceanarray/config/report_tokens.py
8
+ 18cba25d288c74129f4e393199fb0b005f7e0c926a11a4c67aba3104f72e7f61 oceanarray/config/report.mplstyle
9
+ ab5ee1964e0a0aebba73f28bbbaf5a4036450d2be821803d357c9d6ba294a10a oceanarray/reports/templates/_nav.html