oceanarray 0.3.0__tar.gz → 0.4.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 (306) hide show
  1. oceanarray-0.4.0/.gitattributes +8 -0
  2. oceanarray-0.4.0/.github/PULL_REQUEST_TEMPLATE.md +29 -0
  3. oceanarray-0.4.0/.github/dependabot.yml +18 -0
  4. {oceanarray-0.3.0 → oceanarray-0.4.0}/.github/workflows/docs.yml +2 -2
  5. {oceanarray-0.3.0 → oceanarray-0.4.0}/.github/workflows/docs_deploy.yml +2 -2
  6. oceanarray-0.4.0/.github/workflows/tests.yml +91 -0
  7. {oceanarray-0.3.0 → oceanarray-0.4.0}/.gitignore +7 -2
  8. {oceanarray-0.3.0 → oceanarray-0.4.0}/CHANGELOG.md +34 -0
  9. {oceanarray-0.3.0 → oceanarray-0.4.0}/CITATION.cff +3 -2
  10. {oceanarray-0.3.0 → oceanarray-0.4.0}/CONTRIBUTING.md +50 -8
  11. {oceanarray-0.3.0 → oceanarray-0.4.0}/MIGRATION-BASEDIR.md +1 -3
  12. {oceanarray-0.3.0/oceanarray.egg-info → oceanarray-0.4.0}/PKG-INFO +29 -10
  13. {oceanarray-0.3.0 → oceanarray-0.4.0}/README.md +7 -5
  14. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/Makefile +11 -1
  15. oceanarray-0.4.0/docs/environment.yml +12 -0
  16. oceanarray-0.4.0/docs/source/_static/demo/dune2/dune2_1_2026_grid_report.html +684 -0
  17. oceanarray-0.4.0/docs/source/_static/demo/dune2/dune2_1_2026_report.html +1600 -0
  18. oceanarray-0.4.0/docs/source/_static/demo/dune2/dune2_1_2026_stack_report.html +1217 -0
  19. oceanarray-0.4.0/docs/source/_static/demo/dune2/instrument/dune2_1_2026_2941_report.html +1084 -0
  20. oceanarray-0.4.0/docs/source/_static/demo/dune2/instrument/dune2_1_2026_9920_report.html +1827 -0
  21. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/calibration_dips.rst +1 -1
  22. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/cli_reference.rst +107 -158
  23. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/directory_structure.rst +1 -1
  24. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/index.rst +2 -2
  25. oceanarray-0.4.0/docs/source/installation.rst +105 -0
  26. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/legacy.rst +1 -3
  27. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/methods/acquisition.rst +2 -2
  28. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/methods/auto_qc.rst +1 -1
  29. oceanarray-0.4.0/docs/source/methods/calibration.rst +236 -0
  30. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/methods/standardisation.rst +1 -1
  31. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/methods/time_gridding.rst +2 -2
  32. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/methods/vertical_gridding.rst +3 -3
  33. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/oceanarray.rst +5 -3
  34. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/oceanarray_format.rst +4 -4
  35. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/processing_framework.rst +24 -21
  36. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/project_structure.md +12 -13
  37. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/quickstart.rst +9 -13
  38. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/reports.rst +56 -11
  39. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/roadmap.rst +48 -23
  40. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/style_guide.md +1 -1
  41. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/troubleshooting.rst +8 -20
  42. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/yaml_configuration.rst +1 -2
  43. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/__init__.py +13 -0
  44. oceanarray-0.4.0/oceanarray/_version.py +1 -0
  45. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/analysis/clock.py +11 -12
  46. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/analysis/hydrographic.py +7 -5
  47. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/analysis/science.py +15 -15
  48. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/analysis/spectral.py +11 -11
  49. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/analysis/temporal.py +2 -2
  50. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/cli.py +350 -451
  51. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/config/parameters.py +152 -22
  52. oceanarray-0.4.0/oceanarray/config/report.mplstyle +26 -0
  53. oceanarray-0.4.0/oceanarray/config/report_tokens.py +242 -0
  54. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/config/validation.py +30 -30
  55. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/inspect.py +7 -7
  56. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/logger.py +2 -2
  57. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/paths.py +83 -3
  58. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/plotters/__init__.py +50 -56
  59. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/plotters/_cli_legacy.py +5 -5
  60. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/plotters/animation.py +3 -4
  61. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/plotters/current.py +284 -174
  62. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/plotters/diagnostic.py +305 -159
  63. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/plotters/helpers.py +174 -30
  64. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/plotters/hydrography.py +54 -96
  65. oceanarray-0.4.0/oceanarray/plotters/primitives.py +727 -0
  66. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/plotters/spectrum.py +184 -81
  67. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/plotters/timeseries.py +157 -54
  68. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/plotters/ts.py +217 -76
  69. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/processors/__init__.py +10 -9
  70. oceanarray-0.4.0/oceanarray/processors/caldip.py +309 -0
  71. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/processors/coordinate.py +54 -43
  72. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/processors/grid.py +57 -62
  73. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/processors/helpers.py +29 -17
  74. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/processors/pressure.py +16 -12
  75. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/processors/qc.py +26 -25
  76. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/processors/stack.py +28 -27
  77. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/processors/stage1.py +103 -73
  78. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/processors/stage2.py +20 -19
  79. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/processors/stage3.py +90 -35
  80. oceanarray-0.4.0/oceanarray/reports/__init__.py +6 -0
  81. {oceanarray-0.3.0/oceanarray/report → oceanarray-0.4.0/oceanarray/reports}/_array.py +30 -211
  82. oceanarray-0.4.0/oceanarray/reports/_css.py +267 -0
  83. oceanarray-0.4.0/oceanarray/reports/_encode.py +136 -0
  84. oceanarray-0.4.0/oceanarray/reports/_env.py +101 -0
  85. oceanarray-0.4.0/oceanarray/reports/_figdebug.py +142 -0
  86. oceanarray-0.4.0/oceanarray/reports/_grid.py +650 -0
  87. {oceanarray-0.3.0/oceanarray/report → oceanarray-0.4.0/oceanarray/reports}/_html_helpers.py +140 -53
  88. oceanarray-0.4.0/oceanarray/reports/_instrument.py +656 -0
  89. oceanarray-0.4.0/oceanarray/reports/_manifest.py +449 -0
  90. oceanarray-0.4.0/oceanarray/reports/_mooring.py +862 -0
  91. oceanarray-0.4.0/oceanarray/reports/_pdf.py +415 -0
  92. {oceanarray-0.3.0/oceanarray/report → oceanarray-0.4.0/oceanarray/reports}/_plots.py +285 -348
  93. {oceanarray-0.3.0/oceanarray/report → oceanarray-0.4.0/oceanarray/reports}/_recovery_table.py +22 -169
  94. oceanarray-0.4.0/oceanarray/reports/_report_css.py +23 -0
  95. oceanarray-0.4.0/oceanarray/reports/_slots.py +62 -0
  96. oceanarray-0.4.0/oceanarray/reports/_stack.py +1098 -0
  97. oceanarray-0.4.0/oceanarray/reports/templates/_grid_history.html +10 -0
  98. oceanarray-0.4.0/oceanarray/reports/templates/_grid_nc_globals.html +14 -0
  99. oceanarray-0.4.0/oceanarray/reports/templates/_grid_nc_scalars.html +18 -0
  100. oceanarray-0.4.0/oceanarray/reports/templates/_grid_nc_variables.html +30 -0
  101. oceanarray-0.4.0/oceanarray/reports/templates/_instrument_analog_yaml.html +12 -0
  102. oceanarray-0.4.0/oceanarray/reports/templates/_instrument_files.html +39 -0
  103. oceanarray-0.4.0/oceanarray/reports/templates/_instrument_nc_globals.html +14 -0
  104. oceanarray-0.4.0/oceanarray/reports/templates/_instrument_nc_scalars.html +19 -0
  105. oceanarray-0.4.0/oceanarray/reports/templates/_instrument_nc_variables.html +30 -0
  106. oceanarray-0.4.0/oceanarray/reports/templates/_instrument_qc.html +65 -0
  107. oceanarray-0.4.0/oceanarray/reports/templates/_instrument_rose_note.html +6 -0
  108. oceanarray-0.4.0/oceanarray/reports/templates/_instrument_windows_note.html +36 -0
  109. oceanarray-0.4.0/oceanarray/reports/templates/_macros.html +87 -0
  110. oceanarray-0.4.0/oceanarray/reports/templates/_mooring_calibration.html +51 -0
  111. oceanarray-0.4.0/oceanarray/reports/templates/_mooring_clock_table.html +59 -0
  112. oceanarray-0.4.0/oceanarray/reports/templates/_mooring_diagram.html +5 -0
  113. oceanarray-0.4.0/oceanarray/reports/templates/_mooring_instruments.html +101 -0
  114. oceanarray-0.4.0/oceanarray/reports/templates/_mooring_issues.html +28 -0
  115. oceanarray-0.4.0/oceanarray/reports/templates/_mooring_pipeline.html +103 -0
  116. oceanarray-0.4.0/oceanarray/reports/templates/_mooring_qc.html +72 -0
  117. oceanarray-0.4.0/oceanarray/reports/templates/_mooring_timing.html +156 -0
  118. oceanarray-0.4.0/oceanarray/reports/templates/_stack_instr_table.html +16 -0
  119. oceanarray-0.4.0/oceanarray/reports/templates/_stack_nc_dims.html +11 -0
  120. oceanarray-0.4.0/oceanarray/reports/templates/_stack_roses_note.html +13 -0
  121. oceanarray-0.4.0/oceanarray/reports/templates/array.html +150 -0
  122. oceanarray-0.4.0/oceanarray/reports/templates/base.html +103 -0
  123. oceanarray-0.4.0/oceanarray/reports/templates/grid.html +43 -0
  124. oceanarray-0.4.0/oceanarray/reports/templates/instrument.html +36 -0
  125. oceanarray-0.4.0/oceanarray/reports/templates/mooring.html +91 -0
  126. oceanarray-0.4.0/oceanarray/reports/templates/recovery_table.html +129 -0
  127. oceanarray-0.4.0/oceanarray/reports/templates/stack.html +28 -0
  128. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/tools/rapid_interp.py +17 -23
  129. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/tools/readers.py +16 -18
  130. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/tools/writers.py +1 -1
  131. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/utilities.py +115 -36
  132. {oceanarray-0.3.0 → oceanarray-0.4.0/oceanarray.egg-info}/PKG-INFO +29 -10
  133. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray.egg-info/SOURCES.txt +76 -16
  134. oceanarray-0.4.0/oceanarray.egg-info/requires.txt +37 -0
  135. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray.egg-info/scm_file_list.json +76 -16
  136. oceanarray-0.4.0/oceanarray.egg-info/scm_version.json +8 -0
  137. oceanarray-0.4.0/pyproject.toml +205 -0
  138. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/conftest.py +5 -4
  139. oceanarray-0.4.0/tests/fixtures/caldip/castM4_caldip.nc +0 -0
  140. oceanarray-0.4.0/tests/fixtures/golden/dune2/dune2_1_2026_grid_report.html +692 -0
  141. oceanarray-0.4.0/tests/fixtures/golden/dune2/dune2_1_2026_report.html +1615 -0
  142. oceanarray-0.4.0/tests/fixtures/golden/dune2/dune2_1_2026_stack_report.html +1210 -0
  143. oceanarray-0.4.0/tests/fixtures/golden/dune2/instrument/dune2_1_2026_2941_report.html +1092 -0
  144. oceanarray-0.4.0/tests/fixtures/golden/dune2/instrument/dune2_1_2026_9920_report.html +1835 -0
  145. oceanarray-0.4.0/tests/fixtures/proc/MIXSED2026.array.yaml +94 -0
  146. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/fixtures/proc/dune2_1_2026/microcat/dune2_1_2026_2941_stage1.nc +0 -0
  147. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/fixtures/proc/dune2_1_2026/microcat/dune2_1_2026_2941_stage2.nc +0 -0
  148. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/integration/test_pipeline.py +3 -3
  149. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/integration/test_recovery_table.py +1 -1
  150. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/integration/test_time_gridding.py +3 -3
  151. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/legacy/test_convertOS.py +2 -1
  152. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/legacy/test_mooring_rodb.py +1 -2
  153. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/legacy/test_rodb.py +2 -2
  154. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/unit/test_array.py +51 -3
  155. oceanarray-0.4.0/tests/unit/test_caldip.py +164 -0
  156. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/unit/test_cli.py +47 -25
  157. oceanarray-0.4.0/tests/unit/test_grid_manifest.py +291 -0
  158. oceanarray-0.4.0/tests/unit/test_helpers.py +260 -0
  159. oceanarray-0.4.0/tests/unit/test_instrument_manifest.py +73 -0
  160. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/unit/test_logger.py +2 -2
  161. oceanarray-0.4.0/tests/unit/test_manifest.py +372 -0
  162. oceanarray-0.4.0/tests/unit/test_mooring_manifest.py +66 -0
  163. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/unit/test_paths.py +44 -2
  164. oceanarray-0.4.0/tests/unit/test_pdf_report.py +384 -0
  165. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/unit/test_plot_guard.py +23 -41
  166. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/unit/test_plotters.py +103 -0
  167. oceanarray-0.4.0/tests/unit/test_pressure.py +323 -0
  168. oceanarray-0.4.0/tests/unit/test_qc.py +360 -0
  169. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/unit/test_recovery_table.py +2 -2
  170. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/unit/test_report.py +40 -12
  171. oceanarray-0.4.0/tests/unit/test_report_golden.py +205 -0
  172. oceanarray-0.4.0/tests/unit/test_report_tokens.py +186 -0
  173. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/unit/test_stage1.py +42 -6
  174. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/unit/test_stage3.py +7 -3
  175. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/unit/test_time_gridding.py +1 -3
  176. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/unit/test_tools.py +1 -2
  177. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/unit/test_utilities.py +91 -6
  178. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/unit/test_writers.py +1 -1
  179. oceanarray-0.3.0/.github/PULL_REQUEST_TEMPLATE.md +0 -45
  180. oceanarray-0.3.0/.github/dependabot.yml +0 -48
  181. oceanarray-0.3.0/.github/workflows/tests.yml +0 -63
  182. oceanarray-0.3.0/docs/source/methods/calibration.rst +0 -107
  183. oceanarray-0.3.0/docs/source/setup.md +0 -92
  184. oceanarray-0.3.0/environment.yml +0 -13
  185. oceanarray-0.3.0/oceanarray/_version.py +0 -1
  186. oceanarray-0.3.0/oceanarray/oceanarray.mplstyle +0 -18
  187. oceanarray-0.3.0/oceanarray/plotters/primitives.py +0 -336
  188. oceanarray-0.3.0/oceanarray/processors/caldip.py +0 -1
  189. oceanarray-0.3.0/oceanarray/report/__init__.py +0 -5
  190. oceanarray-0.3.0/oceanarray/report/_grid.py +0 -558
  191. oceanarray-0.3.0/oceanarray/report/_instrument.py +0 -866
  192. oceanarray-0.3.0/oceanarray/report/_mooring.py +0 -1514
  193. oceanarray-0.3.0/oceanarray/report/_stack.py +0 -950
  194. oceanarray-0.3.0/oceanarray.egg-info/requires.txt +0 -14
  195. oceanarray-0.3.0/oceanarray.egg-info/scm_version.json +0 -8
  196. oceanarray-0.3.0/pyproject.toml +0 -143
  197. oceanarray-0.3.0/pytest.ini +0 -7
  198. oceanarray-0.3.0/requirements-dev.txt +0 -21
  199. oceanarray-0.3.0/requirements-test.txt +0 -5
  200. oceanarray-0.3.0/requirements.txt +0 -31
  201. {oceanarray-0.3.0 → oceanarray-0.4.0}/.github/ISSUE_TEMPLATE.md +0 -0
  202. {oceanarray-0.3.0 → oceanarray-0.4.0}/.github/workflows/pypi.yml +0 -0
  203. {oceanarray-0.3.0 → oceanarray-0.4.0}/LICENSE +0 -0
  204. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/_static/How do I transform a coordinate system manually_ /342/200/223 Nortek Support Center.pdf +0 -0
  205. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/_static/array_processing.png +0 -0
  206. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/_static/array_processing_v2.png +0 -0
  207. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/_static/code/3_beam_transformation.py +0 -0
  208. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/_static/code/auto_filt.m +0 -0
  209. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/_static/code/hydro_grid.m +0 -0
  210. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/_static/code/microcat2rodb_2.m +0 -0
  211. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/_static/code/microcat2rodb_3.m +0 -0
  212. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/_static/code/microcat_apply_cal.m +0 -0
  213. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/_static/code/microcat_apply_cal_plus.m +0 -0
  214. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/_static/code/microcat_raw2use_003.m +0 -0
  215. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/_static/code/mooring_interp_wb2_3_5.m +0 -0
  216. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/_static/css/custom.css +0 -0
  217. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/_static/github_solo_workflow.png +0 -0
  218. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/_static/github_workflow2.png +0 -0
  219. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/_static/instrument_processing.png +0 -0
  220. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/_static/instrument_processing_v2.png +0 -0
  221. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/_static/instrument_processing_v4.png +0 -0
  222. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/_static/instrument_processing_v5.png +0 -0
  223. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/_static/instrument_processing_v6.png +0 -0
  224. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/_static/logo.png +0 -0
  225. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/_static/mooring_processing.png +0 -0
  226. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/_static/mooring_processing_V2.png +0 -0
  227. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/_static/mooring_processing_v3.png +0 -0
  228. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/_static/mooring_processing_v4.png +0 -0
  229. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/_static/oceanarray_grid_report.png +0 -0
  230. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/_static/oceanarray_icon.png +0 -0
  231. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/_static/oceanarray_instrument_report.png +0 -0
  232. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/_static/oceanarray_report_header.png +0 -0
  233. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/_static/oceanarray_stack_report.png +0 -0
  234. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/_static/rotary_spectrum_plan.rst +0 -0
  235. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/clock_offset.rst +0 -0
  236. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/conf.py +0 -0
  237. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/file_naming_conventions.rst +0 -0
  238. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/methods/concatenation.rst +0 -0
  239. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/methods/conversion.rst +0 -0
  240. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/methods/multisite_merging.rst +0 -0
  241. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/methods/nortek_coordinate_transform.rst +0 -0
  242. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/methods/trimming.rst +0 -0
  243. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/migration.rst +0 -0
  244. {oceanarray-0.3.0 → oceanarray-0.4.0}/docs/source/oceanSITES_manual.rst +0 -0
  245. {oceanarray-0.3.0 → oceanarray-0.4.0}/notebooks/demo_check_clock.ipynb +0 -0
  246. {oceanarray-0.3.0 → oceanarray-0.4.0}/notebooks/demo_climatology.ipynb +0 -0
  247. {oceanarray-0.3.0 → oceanarray-0.4.0}/notebooks/demo_clock_offset.ipynb +0 -0
  248. {oceanarray-0.3.0 → oceanarray-0.4.0}/notebooks/demo_instrument.ipynb +0 -0
  249. {oceanarray-0.3.0 → oceanarray-0.4.0}/notebooks/demo_mooring.ipynb +0 -0
  250. {oceanarray-0.3.0 → oceanarray-0.4.0}/notebooks/demo_stage1.ipynb +0 -0
  251. {oceanarray-0.3.0 → oceanarray-0.4.0}/notebooks/demo_stage2.ipynb +0 -0
  252. {oceanarray-0.3.0 → oceanarray-0.4.0}/notebooks/demo_step1.ipynb +0 -0
  253. {oceanarray-0.3.0 → oceanarray-0.4.0}/notebooks/dsE_1_2018_microcat_7518_temperature.png +0 -0
  254. {oceanarray-0.3.0 → oceanarray-0.4.0}/notebooks/legacy/README.md +0 -0
  255. {oceanarray-0.3.0 → oceanarray-0.4.0}/notebooks/legacy/demo_batch_instrument.ipynb +0 -0
  256. {oceanarray-0.3.0 → oceanarray-0.4.0}/notebooks/legacy/demo_instrument_rdb.ipynb +0 -0
  257. {oceanarray-0.3.0 → oceanarray-0.4.0}/notebooks/legacy/demo_mooring_rdb.ipynb +0 -0
  258. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/analysis/__init__.py +0 -0
  259. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/analysis/vector.py +0 -0
  260. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/config/OS1_sensor_attrs.yaml +0 -0
  261. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/config/OS1_var_names.yaml +0 -0
  262. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/config/__init__.py +0 -0
  263. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/config/legacy/project_RAPID.yaml +0 -0
  264. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/config/legacy/rodb_keys.txt +0 -0
  265. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/config/legacy/rodb_keys.yaml +0 -0
  266. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/config/logging.yaml +0 -0
  267. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/legacy/OS1_vocab_attrs.yaml +0 -0
  268. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/legacy/__init__.py +0 -0
  269. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/legacy/caldip.py +0 -0
  270. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/legacy/convertOS.py +0 -0
  271. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/legacy/find_deployment.py +0 -0
  272. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/legacy/mooring_rodb.py +0 -0
  273. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/legacy/process_rodb.py +0 -0
  274. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/legacy/rodb.py +0 -0
  275. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/legacy/tools.py +0 -0
  276. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray/tools/__init__.py +0 -0
  277. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray.egg-info/dependency_links.txt +0 -0
  278. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray.egg-info/entry_points.txt +0 -0
  279. {oceanarray-0.3.0 → oceanarray-0.4.0}/oceanarray.egg-info/top_level.txt +0 -0
  280. {oceanarray-0.3.0 → oceanarray-0.4.0}/setup.cfg +0 -0
  281. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/fixtures/proc/dune2_1_2026/aquadopp/dune2_1_2026_9920_stage1.nc +0 -0
  282. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/fixtures/proc/dune2_1_2026/aquadopp/dune2_1_2026_9920_stage2.nc +0 -0
  283. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/fixtures/proc/dune2_1_2026/aquadopp/dune2_1_2026_9920_stage3.nc +0 -0
  284. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/fixtures/proc/dune2_1_2026/dune2_1_2026.mooring.yaml +0 -0
  285. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/fixtures/proc/dune2_1_2026/dune2_1_2026_grid.nc +0 -0
  286. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/fixtures/proc/dune2_1_2026/dune2_1_2026_stack.nc +0 -0
  287. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/fixtures/proc/dune2_1_2026/microcat/dune2_1_2026_2941_stage3.nc +0 -0
  288. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/fixtures/raw/dune2_1_2026/aquadopp/9920_recovery.dat +0 -0
  289. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/fixtures/raw/dune2_1_2026/aquadopp/9920_recovery.hdr +0 -0
  290. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/fixtures/raw/dune2_1_2026/microcat/2941_recovery.asc +0 -0
  291. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/fixtures/regenerate_dune2_microcat.py +0 -0
  292. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/integration/__init__.py +0 -0
  293. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/integration/conftest.py +1 -1
  294. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/integration/test_readers.py +0 -0
  295. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/integration/test_stage1.py +0 -0
  296. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/integration/test_stage1_from_raw.py +0 -0
  297. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/integration/test_stage2.py +0 -0
  298. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/legacy/__init__.py +0 -0
  299. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/legacy/test_process_rodb.py +0 -0
  300. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/test_imports.py +0 -0
  301. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/unit/__init__.py +0 -0
  302. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/unit/test_flag_merge.py +0 -0
  303. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/unit/test_parameters.py +0 -0
  304. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/unit/test_process_api.py +0 -0
  305. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/unit/test_stage2.py +0 -0
  306. {oceanarray-0.3.0 → oceanarray-0.4.0}/tests/unit/test_validation.py +0 -0
@@ -0,0 +1,8 @@
1
+ # Generated report HTML: exclude both from GitHub language stats and collapse in
2
+ # PR diffs (linguist-generated). Golden fixtures stay diffable — their images are
3
+ # masked, so text/structure diffs are meaningful on rebaseline. The hosted demo
4
+ # reports are pure display artifacts: `binary` (= -diff -merge -text) treats them
5
+ # as opaque blobs — no textual diff, no merge, no line-ending normalization. Both
6
+ # remain tracked/committed (the demo suite is served from _static by Sphinx).
7
+ tests/fixtures/golden/** linguist-generated=true
8
+ docs/source/_static/demo/** linguist-generated=true binary
@@ -0,0 +1,29 @@
1
+ <!--
2
+ Title: prefix with one tag — [DOC] [FIX] [FEAT] [REFACTOR] [TEST] [CI] [CLEANUP]
3
+ Example: [FIX] Correct dimension handling in RBR reader
4
+ Keep it concise. Delete any section that does not apply (except Summary).
5
+ Write each bullet/paragraph as one continuous line — GitHub soft-wraps.
6
+ -->
7
+
8
+ ## Summary
9
+
10
+ What changed and why, in one short paragraph.
11
+
12
+ ## What's changed
13
+
14
+ - Concrete change (one bullet each).
15
+
16
+ ## Breaking changes
17
+
18
+ Each breaking change and how to migrate (removed/renamed public API or CLI flag, changed signature or parameter meaning, changed output/config layout). Write "None" if there are none — keep the section so reviewers see it was considered.
19
+
20
+ ## Notes
21
+
22
+ Optional — design decisions or trade-offs, screenshots if outputs changed, related issues (Fixes #, Related to #), and anything reviewers should look at closely.
23
+
24
+ ## Checklist
25
+
26
+ - [ ] Followed the [code conventions](CONTRIBUTING.md)
27
+ - [ ] Added or updated tests to cover the change
28
+ - [ ] Updated documentation if needed
29
+ - [ ] Ran `ruff check . --fix` and `pytest` — all pass
@@ -0,0 +1,18 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "github-actions"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "monthly"
7
+ time: "09:00"
8
+ open-pull-requests-limit: 5
9
+ commit-message:
10
+ prefix: "[CI]"
11
+ include: "scope"
12
+ reviewers:
13
+ - "eleanorfrajka"
14
+ assignees:
15
+ - "eleanorfrajka"
16
+ labels:
17
+ - "github-actions"
18
+ - "automated"
@@ -23,7 +23,7 @@ jobs:
23
23
  - name: Setup Micromamba
24
24
  uses: mamba-org/setup-micromamba@v2
25
25
  with:
26
- environment-file: environment.yml
26
+ environment-file: docs/environment.yml
27
27
  init-shell: bash
28
28
  condarc: |
29
29
  channels:
@@ -35,7 +35,7 @@ jobs:
35
35
  shell: bash -l {0}
36
36
  run: |
37
37
  micromamba run -n oceanarray python -m pip install --upgrade pip
38
- micromamba run -n oceanarray python -m pip install -e . --no-deps --force-reinstall
38
+ micromamba run -n oceanarray python -m pip install -e ".[dev]" --force-reinstall
39
39
 
40
40
  - name: Build documentation
41
41
  shell: bash -l {0}
@@ -22,7 +22,7 @@ jobs:
22
22
  - name: Setup Micromamba
23
23
  uses: mamba-org/setup-micromamba@v2
24
24
  with:
25
- environment-file: environment.yml
25
+ environment-file: docs/environment.yml
26
26
  init-shell: bash
27
27
  condarc: |
28
28
  channels:
@@ -34,7 +34,7 @@ jobs:
34
34
  shell: bash -l {0}
35
35
  run: |
36
36
  micromamba run -n oceanarray python -m pip install --upgrade pip
37
- micromamba run -n oceanarray python -m pip install -e . --no-deps --force-reinstall
37
+ micromamba run -n oceanarray python -m pip install -e ".[dev]" --force-reinstall
38
38
 
39
39
  - name: Build documentation
40
40
  shell: bash -l {0}
@@ -0,0 +1,91 @@
1
+ name: Run tests
2
+
3
+ on:
4
+ push:
5
+ branches: [main] # post-merge on main only
6
+ pull_request: # every PR (branch pushes run here, not twice)
7
+
8
+ # Cancel superseded runs when a branch/PR is pushed again in quick succession.
9
+ concurrency:
10
+ group: tests-${{ github.workflow }}-${{ github.ref }}
11
+ cancel-in-progress: true
12
+
13
+ jobs:
14
+ unit:
15
+ runs-on: ${{ matrix.os }}
16
+ # Experimental legs (3.13) are allowed to fail without cancelling real jobs.
17
+ continue-on-error: ${{ matrix.experimental == true }}
18
+ strategy:
19
+ fail-fast: false
20
+ matrix:
21
+ os: [ubuntu-latest, macos-latest, windows-latest]
22
+ python-version: ["3.11"] # full 3-OS coverage on the primary version
23
+ include:
24
+ # Verify the supported range (requires-python >=3.10; docs say 3.10–3.12),
25
+ # ubuntu-only to keep the job count down.
26
+ - { os: ubuntu-latest, python-version: "3.10" }
27
+ - { 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 }
31
+
32
+ steps:
33
+ - uses: actions/checkout@v4
34
+
35
+ - name: Set up Python ${{ matrix.python-version }}
36
+ uses: actions/setup-python@v5
37
+ with:
38
+ python-version: ${{ matrix.python-version }}
39
+ cache: "pip"
40
+
41
+ - name: Install oceanarray (test extra = runtime + pytest)
42
+ run: |
43
+ python -m pip install --upgrade pip
44
+ pip install -e ".[test]"
45
+
46
+ - name: Run unit tests
47
+ # Coverage gate runs once, on the canonical ubuntu + 3.11 leg; the extra
48
+ # version legs run --no-cov so they only verify install + test pass.
49
+ run: >
50
+ 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' }}
52
+
53
+ integration:
54
+ runs-on: ubuntu-latest
55
+ steps:
56
+ - uses: actions/checkout@v4
57
+
58
+ - name: Set up Python 3.11
59
+ uses: actions/setup-python@v5
60
+ with:
61
+ python-version: "3.11"
62
+ cache: "pip"
63
+
64
+ # seasenselib is a core dependency, so the golden integration tests
65
+ # (stage2/stage3/grid) run for real here rather than skipping.
66
+ - name: Install oceanarray (test extra)
67
+ run: |
68
+ python -m pip install --upgrade pip
69
+ pip install -e ".[test]"
70
+
71
+ - name: Run integration tests
72
+ run: pytest tests/integration -m "not local" -q
73
+
74
+ lint:
75
+ runs-on: ubuntu-latest
76
+ steps:
77
+ - uses: actions/checkout@v4
78
+
79
+ - name: Set up Python 3.11
80
+ uses: actions/setup-python@v5
81
+ with:
82
+ python-version: "3.11"
83
+
84
+ - name: Install ruff
85
+ run: pip install ruff
86
+
87
+ - name: Lint (ruff check)
88
+ run: ruff check .
89
+
90
+ - name: Format check (ruff format)
91
+ run: ruff format --check .
@@ -22,8 +22,6 @@ debug_caldip.py
22
22
  example_caldip_usage.py
23
23
  simple_caldip_plot.py
24
24
  plot_calibration_data.py
25
- test_caldip.py
26
- test_caldip_simple.py
27
25
  data/moor/proc_calib/
28
26
  calibration_data_plot.png
29
27
  calibration_dip_comparison.png
@@ -32,6 +30,9 @@ matlab_calibration/
32
30
  logs/*log
33
31
 
34
32
 
33
+ # macOS
34
+ .DS_Store
35
+
35
36
  # VSCode settings
36
37
  .vscode/*
37
38
 
@@ -212,3 +213,7 @@ data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606397_2018_08_27.cnv
212
213
  data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606401_2018_08_27.cnv
213
214
  data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606402_2018_08_27.cnv
214
215
  data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606409_2018_08_27.cnv
216
+
217
+ # Generated report output under test fixtures (HTML + multi-MB PDFs) — regenerated
218
+ # by `oceanarray report ... --pdf`; never commit into history.
219
+ tests/fixtures/proc/*/report/
@@ -4,6 +4,40 @@ All notable changes to oceanarray are documented here.
4
4
 
5
5
  ---
6
6
 
7
+ ## [Unreleased]
8
+
9
+ ## [0.4.0] — 2026-09-08
10
+
11
+ ### Added
12
+
13
+ - **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.
14
+ - **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).
15
+ - **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.
16
+ - **`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.
17
+ - **Zenodo DOI** ([#68](https://github.com/ocean-uhh/oceanarray/pull/68)): concept-DOI badge in the README and `CITATION.cff`.
18
+ - A hosted, clickable dune2 example report suite in the docs ([#82](https://github.com/ocean-uhh/oceanarray/pull/82)).
19
+
20
+ ### Changed
21
+
22
+ - **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)).
23
+ - **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)).
24
+ - **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)).
25
+
26
+ ### Fixed
27
+
28
+ - 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)).
29
+ - 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)).
30
+ - `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)).
31
+
32
+ ### Breaking changes
33
+
34
+ - **`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.
35
+ - **`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.
36
+ - **Python 3.9 dropped** ([#85](https://github.com/ocean-uhh/oceanarray/pull/85)): the minimum supported version is now 3.10.
37
+ - 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.
38
+
39
+ ---
40
+
7
41
  ## [0.3.0] — 2026-08-11
8
42
 
9
43
  ### Breaking changes
@@ -6,8 +6,9 @@ authors:
6
6
  orcid: https://orcid.org/0000-0001-8773-7838
7
7
  affiliation: University of Hamburg, Bundesstraße 53, 20146 Hamburg, Germany
8
8
  title: oceanarray
9
- version: 0.3.0
10
- date-released: 2026-08-11
9
+ doi: 10.5281/zenodo.21890564
10
+ version: 0.4.0
11
+ date-released: 2026-09-08
11
12
  url: https://github.com/ocean-uhh/oceanarray
12
13
  repository-code: https://github.com/ocean-uhh/oceanarray
13
14
  license: MIT
@@ -6,6 +6,8 @@ All contributions are welcome: bug reports, feature suggestions, documentation i
6
6
 
7
7
  ## Table of Contents
8
8
 
9
+ - [Licensing of contributions](#licensing-of-contributions)
10
+ - [Credit and authorship](#credit-and-authorship)
9
11
  - [I Have a Question](#i-have-a-question)
10
12
  - [Reporting Bugs](#reporting-bugs)
11
13
  - [Suggesting Enhancements](#suggesting-enhancements)
@@ -14,6 +16,33 @@ All contributions are welcome: bug reports, feature suggestions, documentation i
14
16
 
15
17
  ---
16
18
 
19
+ ## Licensing of contributions
20
+
21
+ oceanarray is MIT licensed, and contributions are accepted **under the same licence** — what GitHub calls "inbound = outbound". By opening a pull request you confirm that:
22
+
23
+ 1. you wrote the contribution, or you have the right to submit it; and
24
+ 2. you agree to license it to the project under the MIT licence.
25
+
26
+ This does not transfer your copyright, which remains yours.
27
+
28
+ **If your contribution contains code from somewhere else** — another repository, a paper's supplementary material, a Stack Overflow answer, a colleague's script, or generated output you did not review — say so in the pull request and name the source and its licence. This is the single most useful thing you can tell a reviewer. Code from an unlicensed source cannot be merged until its author agrees, so flagging it early avoids the work being wasted.
29
+
30
+ ---
31
+
32
+ ## Credit and authorship
33
+
34
+ Three separate things.
35
+
36
+ **Copyright** stays with whoever wrote the code. You are not asked to assign it.
37
+
38
+ **Contributor credit** is automatic: everyone whose pull request is merged appears in the git history. If your name or preferred email in the git log is wrong, add a `.mailmap` entry via a pull request — that is the correct fix.
39
+
40
+ **Citation authorship** is the author list in `CITATION.cff`, which propagates into the Zenodo DOI for every release and therefore into other people's bibliographies. It reflects *substantial* contribution to the software — its design, a significant body of its implementation, its test suite, or its documentation architecture — and is decided by the maintainer at release time. Funding or supervision alone does not qualify. There is no line count that guarantees it or excludes it. If you believe your contribution crosses that line and it has not been reflected, please say so in an issue — being asked is better than being resented.
41
+
42
+ Where a contribution is adapted from someone else's work rather than written from scratch, we credit it **in the docstring of the code itself**, so the attribution travels with the code rather than living in a file nobody reads (see the existing examples in `utilities.py` and `plotters/current.py`).
43
+
44
+ ---
45
+
17
46
  ## I Have a Question
18
47
 
19
48
  Read the [documentation](https://ocean-uhh.github.io/oceanarray/) first.
@@ -75,19 +104,31 @@ Processing flows from raw files → Stage 1 (CF-NetCDF) → Stage 2 (trimming +
75
104
  git clone https://github.com/ocean-uhh/oceanarray.git
76
105
  cd oceanarray
77
106
  python -m venv venv && source venv/bin/activate
78
- pip install -e .
79
- pip install -r requirements-dev.txt
80
- # seasenselib (needed for raw file reading):
81
- pip install pyrsktools pycnv
82
- pip install seasenselib --no-deps
107
+ pip install --upgrade pip
108
+ pip install -e ".[dev]"
83
109
  ```
84
110
 
111
+ This installs the runtime stack (including `seasenselib` for raw-file reading),
112
+ plus the test and docs tooling and `ruff`, in one resolution. To also work on
113
+ PDF report output (WeasyPrint, which needs native pango/cairo libraries), use
114
+ `pip install -e ".[all]"` (everything, equivalent to `.[dev,pdf]`).
115
+
85
116
  ### Workflow
86
117
 
87
118
  1. Fork the repository and create a feature branch from `main`.
88
119
  2. Make your changes, following the conventions below.
89
120
  3. Run `ruff check . --fix` and then `pytest` — all tests must pass.
90
- 4. Open a pull request against `main`. Use a title prefixed with `[FEAT]`, `[FIX]`, `[REFACTOR]`, `[DOC]`, `[TEST]`, or `[CLEANUP]`.
121
+ 4. Open a pull request against `main`. Prefix the title with a bracket tag: `[FEAT]`, `[FIX]`, `[REFACTOR]`, `[DOC]`, `[TEST]`, `[CI]`, or `[CLEANUP]`. (PR titles use bracket tags; individual **commit messages** use conventional-commit prefixes — see below.)
122
+
123
+ Keep each pull request to one logical change. A rename PR that also fixes a bug is a PR nobody can review — split them. (This matters most once more than one person is working on the code.)
124
+
125
+ ### Commit messages
126
+
127
+ Use conventional-commit prefixes (`feat:`, `fix:`, `refactor:`, `docs:`, `test:`, `ci:`, `chore:`) with an imperative subject. If you worked with someone, or adapted their code, add a trailer:
128
+
129
+ ```
130
+ Co-authored-by: Name <email@example.com>
131
+ ```
91
132
 
92
133
  ### Code conventions
93
134
 
@@ -97,6 +138,7 @@ pip install seasenselib --no-deps
97
138
  - **Units**: never strip or assume units. Use `gsw` for all seawater property calculations.
98
139
  - **Plot style**: discrete colorbars (`BoundaryNorm`, ≤ 20 levels); call `plt.style.use(str(P.MPLSTYLE))` at the start of every plot function.
99
140
  - **Data provenance**: store all processing parameters (thresholds, coefficients) in NC output attributes so any file can be reprocessed exactly from itself.
141
+ - **No silent defaults**: never substitute a default, guess, or approximation when the correct value cannot be determined. Raise, or warn loudly and record what was assumed in the output's metadata. A plausible wrong number is worse than an error, because nothing downstream can detect it.
100
142
 
101
143
  ### Testing
102
144
 
@@ -108,7 +150,7 @@ pytest tests/unit -m "not slow and not needs_seasenselib" # without seasenselib
108
150
  pytest --cov=oceanarray --cov-report=term-missing -q # with coverage
109
151
  ```
110
152
 
111
- New or changed code must have test coverage. Integration tests use committed NetCDF fixtures in `tests/fixtures/`.
153
+ New or changed code must have a test. For anything numerical, assert a **value** you can justify independently of the code — `pytest.approx` or `numpy.testing.assert_allclose` against an analytic case, an invariant that must hold for any input, or a cross-check against `gsw` or another implementation — rather than a value produced by running the code (which proves only that the code has not changed). Do not add tests that pass when nothing happened: `assert result is not None` on a function that returns `None` on failure is the shape to avoid. Integration tests use committed NetCDF fixtures in `tests/fixtures/`.
112
154
 
113
155
  ---
114
156
 
@@ -117,7 +159,7 @@ New or changed code must have test coverage. Integration tests use committed Net
117
159
  Documentation is built with Sphinx from `docs/source/`. To build locally:
118
160
 
119
161
  ```bash
120
- pip install -r requirements-dev.txt
162
+ pip install -e ".[docs]"
121
163
  cd docs && make clean html
122
164
  open build/html/index.html
123
165
  ```
@@ -88,9 +88,7 @@ oceanarray run "$MOORING" \
88
88
  Individual steps:
89
89
 
90
90
  ```bash
91
- oceanarray process dsG3_1_2026 --raw-dir $RAW --proc-dir $PROC --stage 1 2 3
92
- oceanarray stack dsG3_1_2026 --proc-dir $PROC
93
- oceanarray grid dsG3_1_2026 --proc-dir $PROC --dp 10
91
+ oceanarray process dsG3_1_2026 --raw-dir $RAW --proc-dir $PROC --stage 1 2 3 stack grid --dp 10
94
92
  oceanarray report dsG3_1_2026 --raw-dir $RAW --proc-dir $PROC --instruments --stack --grid
95
93
  ```
96
94
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: oceanarray
3
- Version: 0.3.0
3
+ Version: 0.4.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,11 +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.9
39
38
  Classifier: Programming Language :: Python :: 3.10
40
39
  Classifier: Programming Language :: Python :: 3.11
41
40
  Classifier: Programming Language :: Python :: 3.12
42
- Requires-Python: >=3.9
41
+ Requires-Python: >=3.10
43
42
  Description-Content-Type: text/markdown
44
43
  License-File: LICENSE
45
44
  Requires-Dist: numpy>=1.23
@@ -48,14 +47,32 @@ Requires-Dist: xarray>=2023.12.0
48
47
  Requires-Dist: netcdf4>=1.6
49
48
  Requires-Dist: scipy>=1.10
50
49
  Requires-Dist: matplotlib>=3.7
50
+ Requires-Dist: pillow>=9.0
51
51
  Requires-Dist: gsw>=3.6.16
52
52
  Requires-Dist: ppigrf
53
53
  Requires-Dist: ioos_qc
54
- Requires-Dist: dolfyn
55
54
  Requires-Dist: pycwt
55
+ Requires-Dist: seasenselib
56
56
  Requires-Dist: jinja2>=3.0
57
- Requires-Dist: packaging>=21.0
58
57
  Requires-Dist: ruamel.yaml>=0.18
58
+ Provides-Extra: pdf
59
+ Requires-Dist: weasyprint>=60; extra == "pdf"
60
+ Provides-Extra: test
61
+ Requires-Dist: pytest>=8.0; extra == "test"
62
+ Requires-Dist: pytest-cov>=4.1; extra == "test"
63
+ Provides-Extra: docs
64
+ Requires-Dist: sphinx>=7.2; extra == "docs"
65
+ Requires-Dist: sphinx-rtd-theme>=2.0; extra == "docs"
66
+ Requires-Dist: myst-nb>=1.0; extra == "docs"
67
+ Requires-Dist: nbsphinx>=0.9; extra == "docs"
68
+ Requires-Dist: pypandoc>=1.11; extra == "docs"
69
+ Provides-Extra: dev
70
+ Requires-Dist: oceanarray[docs,test]; extra == "dev"
71
+ Requires-Dist: ruff>=0.3; extra == "dev"
72
+ Requires-Dist: jupyterlab>=4.0; extra == "dev"
73
+ Requires-Dist: nbconvert>=7.8; extra == "dev"
74
+ Provides-Extra: all
75
+ Requires-Dist: oceanarray[dev,pdf]; extra == "all"
59
76
  Dynamic: license-file
60
77
 
61
78
  # OceanArray
@@ -65,6 +82,7 @@ Dynamic: license-file
65
82
  [![License: MIT](https://img.shields.io/pypi/l/oceanarray.svg)](https://github.com/ocean-uhh/oceanarray/blob/main/LICENSE)
66
83
  [![Tests](https://github.com/ocean-uhh/oceanarray/actions/workflows/tests.yml/badge.svg)](https://github.com/ocean-uhh/oceanarray/actions/workflows/tests.yml)
67
84
  [![Documentation](https://img.shields.io/badge/docs-ocean--uhh.github.io-blue.svg)](https://ocean-uhh.github.io/oceanarray/)
85
+ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.21890564.svg)](https://doi.org/10.5281/zenodo.21890564)
68
86
 
69
87
  Python tools for processing moored oceanographic array observations from raw instrument files to quality-controlled, CF-compliant NetCDF.
70
88
 
@@ -76,14 +94,15 @@ Python tools for processing moored oceanographic array observations from raw ins
76
94
  pip install oceanarray
77
95
  ```
78
96
 
79
- `seasenselib` is required for reading raw instrument files (available on PyPI but needs `--no-deps`):
97
+ Or, with [uv](https://docs.astral.sh/uv/):
80
98
 
81
99
  ```bash
82
- pip install pyrsktools pycnv
83
- pip install seasenselib --no-deps
100
+ uv pip install oceanarray
84
101
  ```
85
102
 
86
- Python 3.9–3.12 is supported.
103
+ This pulls in `seasenselib` (used to read raw instrument files in stage 1) automatically.
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.
87
106
 
88
107
  ## Quick start
89
108
 
@@ -104,7 +123,7 @@ See the [documentation](https://ocean-uhh.github.io/oceanarray/) for the recomme
104
123
  ```python
105
124
  import oceanarray
106
125
 
107
- oceanarray.process('dsG3_1_2026', raw_dir='/data/raw', proc_dir='/data/proc')
126
+ oceanarray.process("dsG3_1_2026", raw_dir="/data/raw", proc_dir="/data/proc")
108
127
  ```
109
128
 
110
129
  See the [API reference](https://ocean-uhh.github.io/oceanarray/oceanarray.html) for the full interface.
@@ -5,6 +5,7 @@
5
5
  [![License: MIT](https://img.shields.io/pypi/l/oceanarray.svg)](https://github.com/ocean-uhh/oceanarray/blob/main/LICENSE)
6
6
  [![Tests](https://github.com/ocean-uhh/oceanarray/actions/workflows/tests.yml/badge.svg)](https://github.com/ocean-uhh/oceanarray/actions/workflows/tests.yml)
7
7
  [![Documentation](https://img.shields.io/badge/docs-ocean--uhh.github.io-blue.svg)](https://ocean-uhh.github.io/oceanarray/)
8
+ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.21890564.svg)](https://doi.org/10.5281/zenodo.21890564)
8
9
 
9
10
  Python tools for processing moored oceanographic array observations from raw instrument files to quality-controlled, CF-compliant NetCDF.
10
11
 
@@ -16,14 +17,15 @@ Python tools for processing moored oceanographic array observations from raw ins
16
17
  pip install oceanarray
17
18
  ```
18
19
 
19
- `seasenselib` is required for reading raw instrument files (available on PyPI but needs `--no-deps`):
20
+ Or, with [uv](https://docs.astral.sh/uv/):
20
21
 
21
22
  ```bash
22
- pip install pyrsktools pycnv
23
- pip install seasenselib --no-deps
23
+ uv pip install oceanarray
24
24
  ```
25
25
 
26
- Python 3.9–3.12 is supported.
26
+ This pulls in `seasenselib` (used to read raw instrument files in stage 1) automatically.
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.
27
29
 
28
30
  ## Quick start
29
31
 
@@ -44,7 +46,7 @@ See the [documentation](https://ocean-uhh.github.io/oceanarray/) for the recomme
44
46
  ```python
45
47
  import oceanarray
46
48
 
47
- oceanarray.process('dsG3_1_2026', raw_dir='/data/raw', proc_dir='/data/proc')
49
+ oceanarray.process("dsG3_1_2026", raw_dir="/data/raw", proc_dir="/data/proc")
48
50
  ```
49
51
 
50
52
  See the [API reference](https://ocean-uhh.github.io/oceanarray/oceanarray.html) for the full interface.
@@ -12,7 +12,17 @@ BUILDDIR = build
12
12
  help:
13
13
  @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
14
14
 
15
- .PHONY: help Makefile
15
+ .PHONY: help Makefile demo-report
16
+
17
+ # Refresh the hosted example report suite under source/_static/demo/dune2/ from
18
+ # the dune2_1_2026 fixture reports. Those fixtures are regenerated by the test
19
+ # suite (tests/unit/test_report_golden.py); run pytest first if they are stale.
20
+ demo-report:
21
+ rm -rf source/_static/demo/dune2
22
+ mkdir -p source/_static/demo/dune2/instrument
23
+ cp ../tests/fixtures/proc/dune2_1_2026/report/*.html source/_static/demo/dune2/
24
+ cp ../tests/fixtures/proc/dune2_1_2026/report/instrument/*.html \
25
+ source/_static/demo/dune2/instrument/
16
26
 
17
27
  # Catch-all target: route all unknown targets to Sphinx using the new
18
28
  # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
@@ -0,0 +1,12 @@
1
+ name: oceanarray
2
+ channels: [conda-forge]
3
+ dependencies:
4
+ - python=3.11
5
+ - pip
6
+ - pandoc
7
+ # The editable install (`-e .[dev]`, dev extra = runtime incl. seasenselib +
8
+ # test + docs + pdf + ruff) is done in the workflow's "Install package
9
+ # (editable)" step, not here: setup-micromamba runs an environment-file pip
10
+ # section from the file's own directory (docs/), where `.` has no
11
+ # pyproject.toml. The run step executes from the repo root, so the path
12
+ # resolves correctly and cannot drift with the action's working directory.