pycontrails 0.52.3__tar.gz → 0.53.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.

Potentially problematic release.


This version of pycontrails might be problematic. Click here for more details.

Files changed (271) hide show
  1. {pycontrails-0.52.3 → pycontrails-0.53.0}/.github/workflows/doctest.yaml +2 -0
  2. {pycontrails-0.52.3 → pycontrails-0.53.0}/.github/workflows/release.yaml +2 -2
  3. {pycontrails-0.52.3 → pycontrails-0.53.0}/.github/workflows/test.yaml +2 -1
  4. {pycontrails-0.52.3 → pycontrails-0.53.0}/CHANGELOG.md +18 -0
  5. {pycontrails-0.52.3/pycontrails.egg-info → pycontrails-0.53.0}/PKG-INFO +6 -6
  6. {pycontrails-0.52.3 → pycontrails-0.53.0}/README.md +1 -1
  7. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/api.rst +10 -0
  8. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/install.rst +3 -1
  9. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/_version.py +2 -2
  10. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/core/cache.py +1 -1
  11. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/core/flight.py +8 -5
  12. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/core/flightplan.py +1 -1
  13. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/core/interpolation.py +1 -0
  14. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/core/met.py +11 -13
  15. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/core/met_var.py +1 -1
  16. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/core/models.py +5 -5
  17. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/core/rgi_cython.c +155 -155
  18. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/core/vector.py +5 -5
  19. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/datalib/_leo_utils/vis.py +10 -11
  20. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/datalib/_met_utils/metsource.py +13 -11
  21. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/datalib/ecmwf/era5.py +1 -1
  22. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/datalib/ecmwf/era5_model_level.py +1 -1
  23. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/datalib/ecmwf/hres_model_level.py +3 -3
  24. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/datalib/ecmwf/variables.py +3 -3
  25. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/datalib/gfs/gfs.py +4 -3
  26. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/datalib/landsat.py +10 -9
  27. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/ext/synthetic_flight.py +1 -1
  28. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/accf.py +1 -1
  29. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/apcemm/apcemm.py +5 -5
  30. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/cocip/cocip.py +3 -3
  31. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/cocip/output_formats.py +2 -2
  32. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/cocip/radiative_forcing.py +3 -3
  33. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/cocipgrid/cocip_grid.py +4 -4
  34. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/ps_model/ps_model.py +4 -4
  35. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/sac.py +2 -2
  36. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/physics/thermo.py +1 -1
  37. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/utils/json.py +16 -18
  38. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/utils/types.py +7 -6
  39. {pycontrails-0.52.3 → pycontrails-0.53.0/pycontrails.egg-info}/PKG-INFO +6 -6
  40. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails.egg-info/requires.txt +2 -2
  41. {pycontrails-0.52.3 → pycontrails-0.53.0}/pyproject.toml +8 -7
  42. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/_deprecated.py +2 -2
  43. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_fleet.py +2 -2
  44. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_flight.py +3 -1
  45. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_met.py +2 -2
  46. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_models.py +3 -3
  47. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_ps_model.py +1 -1
  48. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_sac_issr.py +4 -1
  49. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_tau_cirrus.py +2 -2
  50. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_units.py +2 -2
  51. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_vector.py +1 -1
  52. {pycontrails-0.52.3 → pycontrails-0.53.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  53. {pycontrails-0.52.3 → pycontrails-0.53.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  54. {pycontrails-0.52.3 → pycontrails-0.53.0}/.github/dependabot.yaml +0 -0
  55. {pycontrails-0.52.3 → pycontrails-0.53.0}/.github/pull_request_template.md +0 -0
  56. {pycontrails-0.52.3 → pycontrails-0.53.0}/.github/workflows/docs.yaml +0 -0
  57. {pycontrails-0.52.3 → pycontrails-0.53.0}/.github/workflows/scorecard.yaml +0 -0
  58. {pycontrails-0.52.3 → pycontrails-0.53.0}/.gitignore +0 -0
  59. {pycontrails-0.52.3 → pycontrails-0.53.0}/.pre-commit-config.yaml +0 -0
  60. {pycontrails-0.52.3 → pycontrails-0.53.0}/.zenodo.json +0 -0
  61. {pycontrails-0.52.3 → pycontrails-0.53.0}/CONTRIBUTING.md +0 -0
  62. {pycontrails-0.52.3 → pycontrails-0.53.0}/LICENSE +0 -0
  63. {pycontrails-0.52.3 → pycontrails-0.53.0}/Makefile +0 -0
  64. {pycontrails-0.52.3 → pycontrails-0.53.0}/NOTICE +0 -0
  65. {pycontrails-0.52.3 → pycontrails-0.53.0}/RELEASE.md +0 -0
  66. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/_static/css/style.css +0 -0
  67. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/_static/img/colab.png +0 -0
  68. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/_static/img/favicon.png +0 -0
  69. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/_static/img/logo-dark.png +0 -0
  70. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/_static/img/logo.png +0 -0
  71. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/_static/pycontrails.bib +0 -0
  72. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/changelog.rst +0 -0
  73. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/conf.py +0 -0
  74. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/contributing.rst +0 -0
  75. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/develop.rst +0 -0
  76. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/flight.rst +0 -0
  77. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/index.rst +0 -0
  78. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/integrations/ACCF.ipynb +0 -0
  79. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/integrations/APCEMM.ipynb +0 -0
  80. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/literature.rst +0 -0
  81. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/meteorology.rst +0 -0
  82. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/models.rst +0 -0
  83. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/notebooks/ARCO-ERA5.ipynb +0 -0
  84. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/notebooks/AircraftPerformance.ipynb +0 -0
  85. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/notebooks/Cache.ipynb +0 -0
  86. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/notebooks/CoCiP.ipynb +0 -0
  87. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/notebooks/ECMWF.ipynb +0 -0
  88. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/notebooks/Flight.ipynb +0 -0
  89. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/notebooks/GFS.ipynb +0 -0
  90. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/notebooks/GOES.ipynb +0 -0
  91. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/notebooks/ISSR.ipynb +0 -0
  92. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/notebooks/Landsat.ipynb +0 -0
  93. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/notebooks/Meteorology.ipynb +0 -0
  94. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/notebooks/SAC.ipynb +0 -0
  95. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/notebooks/Sentinel.ipynb +0 -0
  96. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/notebooks/advection.ipynb +0 -0
  97. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/notebooks/airports.ipynb +0 -0
  98. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/notebooks/data/.gitignore +0 -0
  99. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/notebooks/data/flight-ap.csv +0 -0
  100. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/notebooks/data/flight-cocip.csv +0 -0
  101. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/notebooks/data/flight-fdr.csv +0 -0
  102. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/notebooks/data/flight-noisy.csv +0 -0
  103. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/notebooks/data/flight.csv +0 -0
  104. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/notebooks/data/iagos-flight-landsat.csv +0 -0
  105. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/notebooks/data/iagos-flight-sentinel.csv +0 -0
  106. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/notebooks/flightplan.ipynb +0 -0
  107. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/notebooks/model-levels.ipynb +0 -0
  108. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/notebooks/run-cocip-on-flight.ipynb +0 -0
  109. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/notebooks/run-cocip-with-fdr.ipynb +0 -0
  110. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/notebooks/specific-humidity-interpolation.ipynb +0 -0
  111. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/notebooks.rst +0 -0
  112. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/observations.rst +0 -0
  113. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/tutorials.rst +0 -0
  114. {pycontrails-0.52.3 → pycontrails-0.53.0}/docs/utilities.rst +0 -0
  115. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/__init__.py +0 -0
  116. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/core/__init__.py +0 -0
  117. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/core/aircraft_performance.py +0 -0
  118. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/core/airports.py +0 -0
  119. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/core/coordinates.py +0 -0
  120. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/core/fleet.py +0 -0
  121. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/core/fuel.py +0 -0
  122. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/core/polygon.py +0 -0
  123. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/core/rgi_cython.pyx +0 -0
  124. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/datalib/__init__.py +0 -0
  125. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/datalib/_leo_utils/search.py +0 -0
  126. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/datalib/_leo_utils/static/bq_roi_query.sql +0 -0
  127. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/datalib/ecmwf/__init__.py +0 -0
  128. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/datalib/ecmwf/arco_era5.py +0 -0
  129. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/datalib/ecmwf/common.py +0 -0
  130. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/datalib/ecmwf/hres.py +0 -0
  131. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/datalib/ecmwf/ifs.py +0 -0
  132. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/datalib/ecmwf/model_levels.py +0 -0
  133. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/datalib/ecmwf/static/model_level_dataframe_v20240418.csv +0 -0
  134. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/datalib/gfs/__init__.py +0 -0
  135. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/datalib/gfs/variables.py +0 -0
  136. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/datalib/goes.py +0 -0
  137. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/datalib/sentinel.py +0 -0
  138. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/datalib/spire.py +0 -0
  139. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/ext/bada.py +0 -0
  140. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/ext/cirium.py +0 -0
  141. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/ext/empirical_grid.py +0 -0
  142. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/__init__.py +0 -0
  143. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/apcemm/__init__.py +0 -0
  144. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/apcemm/inputs.py +0 -0
  145. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/apcemm/static/apcemm_yaml_template.yaml +0 -0
  146. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/apcemm/utils.py +0 -0
  147. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/cocip/__init__.py +0 -0
  148. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/cocip/cocip_params.py +0 -0
  149. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/cocip/cocip_uncertainty.py +0 -0
  150. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/cocip/contrail_properties.py +0 -0
  151. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/cocip/radiative_heating.py +0 -0
  152. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/cocip/unterstrasser_wake_vortex.py +0 -0
  153. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/cocip/wake_vortex.py +0 -0
  154. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/cocip/wind_shear.py +0 -0
  155. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/cocipgrid/__init__.py +0 -0
  156. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/cocipgrid/cocip_grid_params.py +0 -0
  157. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/dry_advection.py +0 -0
  158. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/emissions/__init__.py +0 -0
  159. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/emissions/black_carbon.py +0 -0
  160. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/emissions/emissions.py +0 -0
  161. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/emissions/ffm2.py +0 -0
  162. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/emissions/static/default-engine-uids.csv +0 -0
  163. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/emissions/static/edb-gaseous-v29b-engines.csv +0 -0
  164. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/emissions/static/edb-nvpm-v29b-engines.csv +0 -0
  165. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/humidity_scaling/__init__.py +0 -0
  166. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/humidity_scaling/humidity_scaling.py +0 -0
  167. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/humidity_scaling/quantiles/era5-model-level-quantiles.pq +0 -0
  168. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/humidity_scaling/quantiles/era5-pressure-level-quantiles.pq +0 -0
  169. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/issr.py +0 -0
  170. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/pcc.py +0 -0
  171. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/pcr.py +0 -0
  172. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/ps_model/__init__.py +0 -0
  173. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/ps_model/ps_aircraft_params.py +0 -0
  174. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/ps_model/ps_grid.py +0 -0
  175. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/ps_model/ps_operational_limits.py +0 -0
  176. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/ps_model/static/ps-aircraft-params-20240524.csv +0 -0
  177. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/ps_model/static/ps-synonym-list-20240524.csv +0 -0
  178. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/models/tau_cirrus.py +0 -0
  179. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/physics/__init__.py +0 -0
  180. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/physics/constants.py +0 -0
  181. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/physics/geo.py +0 -0
  182. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/physics/jet.py +0 -0
  183. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/physics/units.py +0 -0
  184. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/py.typed +0 -0
  185. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/utils/__init__.py +0 -0
  186. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/utils/dependencies.py +0 -0
  187. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/utils/iteration.py +0 -0
  188. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails/utils/temp.py +0 -0
  189. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails.egg-info/SOURCES.txt +0 -0
  190. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails.egg-info/dependency_links.txt +0 -0
  191. {pycontrails-0.52.3 → pycontrails-0.53.0}/pycontrails.egg-info/top_level.txt +0 -0
  192. {pycontrails-0.52.3 → pycontrails-0.53.0}/setup.cfg +0 -0
  193. {pycontrails-0.52.3 → pycontrails-0.53.0}/setup.py +0 -0
  194. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/__init__.py +0 -0
  195. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/benchmark/cocip/Makefile +0 -0
  196. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/benchmark/cocip/README.md +0 -0
  197. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/benchmark/cocip/benchmark.py +0 -0
  198. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/benchmark/cocip/compare.py +0 -0
  199. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/benchmark/cocip/data.md +0 -0
  200. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/benchmark/cocip/output.py +0 -0
  201. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/benchmark/cocip/review.ipynb +0 -0
  202. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/benchmark/cocip-fortran/README.md +0 -0
  203. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/benchmark/north-atlantic-study/.gcloudignore +0 -0
  204. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/benchmark/north-atlantic-study/README.md +0 -0
  205. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/benchmark/north-atlantic-study/support.py +0 -0
  206. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/benchmark/north-atlantic-study/validate.py +0 -0
  207. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/fixtures/cocip-met.py +0 -0
  208. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/fixtures/cocip-met2.py +0 -0
  209. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/fixtures/ecmwf-met.py +0 -0
  210. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/fixtures/gfs-met.py +0 -0
  211. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/__init__.py +0 -0
  212. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/conftest.py +0 -0
  213. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/static/NOAA_Solar_Calculations_day.csv +0 -0
  214. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/static/cocip-contrail-output.json +0 -0
  215. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/static/cocip-contrail-output2.json +0 -0
  216. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/static/cocip-flight-output.json +0 -0
  217. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/static/cocip-flight-output2.json +0 -0
  218. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/static/cocip-output-contrail-edges.json +0 -0
  219. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/static/cocip-output-flts-20190101-eu.pq +0 -0
  220. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/static/flight-cocip2.csv +0 -0
  221. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/static/flight-meridian.csv +0 -0
  222. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/static/flight-metadata.json +0 -0
  223. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/static/flight-spire-data-cleaning.pq +0 -0
  224. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/static/flight.csv +0 -0
  225. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/static/flt-wypts-20190101-eu.pq +0 -0
  226. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/static/met-20190101-eu.nc +0 -0
  227. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/static/met-accf-pl.nc +0 -0
  228. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/static/met-accf-sl.nc +0 -0
  229. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/static/met-ecmwf-pl.nc +0 -0
  230. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/static/met-ecmwf-sl.nc +0 -0
  231. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/static/met-era5-cocip1.nc +0 -0
  232. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/static/met-era5-cocip2.nc +0 -0
  233. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/static/met-gfs.nc +0 -0
  234. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/static/polygon-bug.nc +0 -0
  235. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/static/rad-20190101-eu.nc +0 -0
  236. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/static/rad-era5-cocip1.nc +0 -0
  237. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/static/rad-era5-cocip2.nc +0 -0
  238. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/static/rad-gfs.nc +0 -0
  239. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_accf.py +0 -0
  240. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_airports.py +0 -0
  241. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_apcemm.py +0 -0
  242. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_cache.py +0 -0
  243. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_cocip.py +0 -0
  244. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_cocip_grid.py +0 -0
  245. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_cocip_grid_parity.py +0 -0
  246. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_cocip_radiative_forcing.py +0 -0
  247. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_cocip_uncertainty.py +0 -0
  248. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_coordinates.py +0 -0
  249. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_datalib_metsource.py +0 -0
  250. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_dry_advection.py +0 -0
  251. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_dtypes.py +0 -0
  252. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_ecmwf.py +0 -0
  253. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_emissions.py +0 -0
  254. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_flightplan.py +0 -0
  255. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_fuel.py +0 -0
  256. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_geo.py +0 -0
  257. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_gfs.py +0 -0
  258. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_goes.py +0 -0
  259. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_grid_to_netcdf.py +0 -0
  260. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_humidity_scaling.py +0 -0
  261. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_init.py +0 -0
  262. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_interpolation.py +0 -0
  263. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_leo.py +0 -0
  264. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_met_cache.py +0 -0
  265. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_pcc.py +0 -0
  266. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_polygons.py +0 -0
  267. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_spire.py +0 -0
  268. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_thermo_sac.py +0 -0
  269. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_unterstrasser_wake_vortex.py +0 -0
  270. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_utils.py +0 -0
  271. {pycontrails-0.52.3 → pycontrails-0.53.0}/tests/unit/test_zarr.py +0 -0
@@ -80,6 +80,8 @@ jobs:
80
80
  run: |
81
81
  make nb-test
82
82
 
83
+ # The doctests require numpy 2.0 or higher
83
84
  - name: Test docstrings
84
85
  run: |
86
+ pip install "numpy>=2.0"
85
87
  make doctest
@@ -42,11 +42,11 @@ jobs:
42
42
  - name: Build wheels
43
43
  uses: pypa/cibuildwheel@v2.20
44
44
  env:
45
- CIBW_BUILD: cp39-* cp310-* cp311-* cp312-*
45
+ CIBW_BUILD: cp310-* cp311-* cp312-* cp313-*
46
46
  CIBW_SKIP: '*-win32 *-manylinux_i686 *-musllinux*'
47
47
  CIBW_BUILD_VERBOSITY: 3
48
48
  CIBW_ARCHS_MACOS: x86_64 arm64
49
- CIBW_TEST_SKIP: '*-macosx_arm64'
49
+ CIBW_TEST_SKIP: '*-macosx_arm64 cp313-*'
50
50
  # Completely isolate tests to prevent cibuildwheel from importing the
51
51
  # source instead of the wheel. This happens when tests/__init__.py is read.
52
52
  CIBW_TEST_EXTRAS: "complete,dev"
@@ -38,7 +38,8 @@ jobs:
38
38
  fail-fast: false
39
39
  matrix:
40
40
  os: [ubuntu-latest, windows-latest]
41
- pyversion: ['3.9', '3.10', '3.11', '3.12']
41
+ # TODO(Fall 2024): Add 3.13 once all dependencies are available
42
+ pyversion: ['3.10', '3.11', '3.12']
42
43
  runs-on: ${{ matrix.os }}
43
44
 
44
45
  steps:
@@ -1,5 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.53.0
4
+
5
+ ### Breaking changes
6
+
7
+ - Drop python 3.9 support per [NEP 29](https://numpy.org/neps/nep-0029-deprecation_policy.html).
8
+
9
+ ### Features
10
+
11
+ - Build wheels for [python 3.13](https://peps.python.org/pep-0719/). (These wheels are available on PyPI, but other pycontrails dependencies may not yet support python 3.13.)
12
+
13
+ ### Fixes
14
+
15
+ - Fix `PycontrailsRegularGridInterpolator` for compatibility with the latest scipy version.
16
+
17
+ ### Internals
18
+
19
+ - Defer import of `skimage` and `rasterio`.
20
+
3
21
  ## v0.52.3
4
22
 
5
23
  ### Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pycontrails
3
- Version: 0.52.3
3
+ Version: 0.53.0
4
4
  Summary: Python library for modeling aviation climate impacts
5
5
  Author-email: Breakthrough Energy <py@contrails.org>
6
6
  License: Apache-2.0
@@ -14,16 +14,16 @@ Classifier: Intended Audience :: Science/Research
14
14
  Classifier: License :: OSI Approved :: Apache Software License
15
15
  Classifier: Operating System :: OS Independent
16
16
  Classifier: Programming Language :: Python :: 3
17
- Classifier: Programming Language :: Python :: 3.9
18
17
  Classifier: Programming Language :: Python :: 3.10
19
18
  Classifier: Programming Language :: Python :: 3.11
20
19
  Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
21
  Classifier: Programming Language :: Python :: 3 :: Only
22
22
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
23
23
  Classifier: Topic :: Scientific/Engineering :: Atmospheric Science
24
24
  Classifier: Topic :: Scientific/Engineering :: GIS
25
25
  Classifier: Typing :: Typed
26
- Requires-Python: >=3.9
26
+ Requires-Python: >=3.10
27
27
  Description-Content-Type: text/markdown
28
28
  License-File: LICENSE
29
29
  License-File: NOTICE
@@ -36,7 +36,7 @@ Requires-Dist: xarray>=2022.3
36
36
  Provides-Extra: complete
37
37
  Requires-Dist: pycontrails[ecmwf,gcp,gfs,jupyter,pyproj,sat,vis,zarr]; extra == "complete"
38
38
  Provides-Extra: dev
39
- Requires-Dist: black[jupyter]==24.4.2; extra == "dev"
39
+ Requires-Dist: black[jupyter]==24.8.0; extra == "dev"
40
40
  Requires-Dist: dep_license; extra == "dev"
41
41
  Requires-Dist: fastparquet>=0.8; extra == "dev"
42
42
  Requires-Dist: ipdb>=0.13; extra == "dev"
@@ -50,7 +50,7 @@ Requires-Dist: pyarrow>=5.0; extra == "dev"
50
50
  Requires-Dist: pytest>=8.2; extra == "dev"
51
51
  Requires-Dist: pytest-cov>=2.11; extra == "dev"
52
52
  Requires-Dist: requests>=2.25; extra == "dev"
53
- Requires-Dist: ruff==0.5.3; extra == "dev"
53
+ Requires-Dist: ruff==0.5.7; extra == "dev"
54
54
  Requires-Dist: setuptools; extra == "dev"
55
55
  Provides-Extra: docs
56
56
  Requires-Dist: doc8>=1.1; extra == "docs"
@@ -141,7 +141,7 @@ Documentation and examples available at [py.contrails.org](https://py.contrails.
141
141
 
142
142
  ### Install with pip
143
143
 
144
- You can install pycontrails from PyPI with `pip` (Python 3.9 or later required):
144
+ You can install pycontrails from PyPI with `pip` (Python 3.10 or later required):
145
145
 
146
146
  ```bash
147
147
  $ pip install pycontrails
@@ -25,7 +25,7 @@ Documentation and examples available at [py.contrails.org](https://py.contrails.
25
25
 
26
26
  ### Install with pip
27
27
 
28
- You can install pycontrails from PyPI with `pip` (Python 3.9 or later required):
28
+ You can install pycontrails from PyPI with `pip` (Python 3.10 or later required):
29
29
 
30
30
  ```bash
31
31
  $ pip install pycontrails
@@ -151,6 +151,16 @@ Gridded CoCiP
151
151
  models.cocipgrid.CocipGridParams
152
152
 
153
153
 
154
+ Dry Advection
155
+ """""""""""""
156
+
157
+ .. autosummary::
158
+ :toctree: api/
159
+
160
+ models.dry_advection.DryAdvection
161
+ models.dry_advection.DryAdvectionParams
162
+
163
+
154
164
  ACCF
155
165
  """"
156
166
 
@@ -17,7 +17,7 @@ The conda-forge package includes all optional runtime dependencies.
17
17
  pip install
18
18
  -----------
19
19
 
20
- With Python 3.9 or later, install the latest release from PyPI using ``pip``:
20
+ With Python 3.10 or later, install the latest release from PyPI using ``pip``:
21
21
 
22
22
  .. code-block:: bash
23
23
 
@@ -27,6 +27,8 @@ With Python 3.9 or later, install the latest release from PyPI using ``pip``:
27
27
  # install with all optional dependencies
28
28
  $ pip install "pycontrails[complete]"
29
29
 
30
+ Wheels are currently built for python 3.10 - 3.13 on Linux, macOS, and Windows. The python 3.13
31
+ wheels are not yet tested in CI/CD and not all runtime dependencies are available for python 3.13.
30
32
 
31
33
  Install the latest development version directly from GitHub:
32
34
 
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '0.52.3'
16
- __version_tuple__ = version_tuple = (0, 52, 3)
15
+ __version__ = version = '0.53.0'
16
+ __version_tuple__ = version_tuple = (0, 53, 0)
@@ -146,7 +146,7 @@ class CacheStore(ABC):
146
146
  """
147
147
 
148
148
  # TODO: run in parallel?
149
- return [self.put(d, cp) for d, cp in zip(data_path, cache_path)]
149
+ return [self.put(d, cp) for d, cp in zip(data_path, cache_path, strict=True)]
150
150
 
151
151
  # In the three methods below, child classes have a complete docstring.
152
152
 
@@ -1356,7 +1356,7 @@ class Flight(GeoVectorDataset):
1356
1356
  # NOTE: geod.npts does not return the initial or terminal points
1357
1357
  lonlats: list[tuple[float, float]] = geod.npts(lon0, lat0, lon1, lat1, n_steps)
1358
1358
 
1359
- lons, lats = zip(*lonlats)
1359
+ lons, lats = zip(*lonlats, strict=True)
1360
1360
  longitudes.extend(lons)
1361
1361
  latitudes.extend(lats)
1362
1362
 
@@ -1657,10 +1657,11 @@ def _return_linestring(data: dict[str, npt.NDArray[np.float64]]) -> list[list[fl
1657
1657
  The list of coordinates
1658
1658
  """
1659
1659
  # rounding to reduce the size of resultant json arrays
1660
- points = zip( # pylint: disable=zip-builtin-not-iterating
1660
+ points = zip(
1661
1661
  np.round(data["longitude"], decimals=4),
1662
1662
  np.round(data["latitude"], decimals=4),
1663
1663
  np.round(data["altitude"], decimals=4),
1664
+ strict=True,
1664
1665
  )
1665
1666
  return [list(p) for p in points]
1666
1667
 
@@ -1949,7 +1950,9 @@ def _altitude_interpolation_climb_descend_middle(
1949
1950
  # Form array of cumulative altitude values if the flight were to climb
1950
1951
  # at nominal_rocd over each group of nan
1951
1952
  cumalt_list = []
1952
- for start_na_idx, end_na_idx, size in zip(start_na_idxs, end_na_idxs, na_group_size):
1953
+ for start_na_idx, end_na_idx, size in zip(
1954
+ start_na_idxs, end_na_idxs, na_group_size, strict=True
1955
+ ):
1953
1956
  if s[start_na_idx] <= s[end_na_idx]:
1954
1957
  cumalt_list.append(np.arange(1, size, dtype=float))
1955
1958
  else:
@@ -2053,7 +2056,7 @@ def filter_altitude(
2053
2056
  --------
2054
2057
  :meth:`traffic.core.flight.Flight.filter`
2055
2058
  :func:`scipy.signal.medfilt`
2056
- """ # noqa: E501
2059
+ """
2057
2060
  if not len(altitude_ft):
2058
2061
  raise ValueError("Altitude must have non-zero length to filter")
2059
2062
 
@@ -2114,7 +2117,7 @@ def filter_altitude(
2114
2117
 
2115
2118
  result = np.copy(altitude_ft)
2116
2119
  if np.any(start_idxs):
2117
- for i0, i1 in zip(start_idxs, end_idxs):
2120
+ for i0, i1 in zip(start_idxs, end_idxs, strict=True):
2118
2121
  result[i0:i1] = altitude_filt[i0:i1]
2119
2122
 
2120
2123
  # reapply Savitzky-Golay filter to smooth climb and descent
@@ -93,7 +93,7 @@ def parse_atc_plan(atc_plan: str) -> dict[str, str]:
93
93
  See Also
94
94
  --------
95
95
  :func:`to_atc_plan`
96
- """ # noqa: E501
96
+ """
97
97
  atc_plan = atc_plan.replace("\r", "")
98
98
  atc_plan = atc_plan.replace("\n", "")
99
99
  atc_plan = atc_plan.upper()
@@ -76,6 +76,7 @@ class PycontrailsRegularGridInterpolator(scipy.interpolate.RegularGridInterpolat
76
76
  self.method = _pick_method(scipy.__version__, method)
77
77
  self.bounds_error = bounds_error
78
78
  self.fill_value = fill_value
79
+ self._spline = None
79
80
 
80
81
  def _prepare_xi_simple(self, xi: npt.NDArray[np.float64]) -> npt.NDArray[np.bool_]:
81
82
  """Run looser version of :meth:`_prepare_xi`.
@@ -70,12 +70,12 @@ class MetBase(ABC, Generic[XArrayType]):
70
70
  cachestore: CacheStore | None
71
71
 
72
72
  #: Default dimension order for DataArray or Dataset (x, y, z, t)
73
- dim_order: list[Hashable] = [
73
+ dim_order: tuple[Hashable, Hashable, Hashable, Hashable] = (
74
74
  "longitude",
75
75
  "latitude",
76
76
  "level",
77
77
  "time",
78
- ]
78
+ )
79
79
 
80
80
  def __repr__(self) -> str:
81
81
  data = getattr(self, "data", None)
@@ -200,10 +200,8 @@ class MetBase(ABC, Generic[XArrayType]):
200
200
  def _validate_transpose(self) -> None:
201
201
  """Check that data is transposed according to :attr:`dim_order`."""
202
202
 
203
- dims_tuple = tuple(self.dim_order)
204
-
205
203
  def _check_da(da: xr.DataArray, key: Hashable | None = None) -> None:
206
- if da.dims != dims_tuple:
204
+ if da.dims != self.dim_order:
207
205
  if key is not None:
208
206
  msg = (
209
207
  f"Data dimension not transposed on variable '{key}'. Initiate with"
@@ -271,7 +269,7 @@ class MetBase(ABC, Generic[XArrayType]):
271
269
  self.data["time"] = self.data["time"].astype("datetime64[ns]", copy=False)
272
270
 
273
271
  # sortby to ensure each coordinate has ascending order
274
- self.data = self.data.sortby(self.dim_order, ascending=True)
272
+ self.data = self.data.sortby(list(self.dim_order), ascending=True)
275
273
 
276
274
  if not self.is_wrapped:
277
275
  # Ensure longitude is contained in interval [-180, 180)
@@ -293,7 +291,7 @@ class MetBase(ABC, Generic[XArrayType]):
293
291
  self._validate_latitude()
294
292
 
295
293
  # transpose to have ordering (x, y, z, t, ...)
296
- dim_order = self.dim_order + [d for d in self.data.dims if d not in self.dim_order]
294
+ dim_order = [*self.dim_order, *(d for d in self.data.dims if d not in self.dim_order)]
297
295
  self.data = self.data.transpose(*dim_order)
298
296
 
299
297
  # single level data
@@ -489,7 +487,7 @@ class MetBase(ABC, Generic[XArrayType]):
489
487
  self.cachestore = self.cachestore or DiskCacheStore()
490
488
 
491
489
  # group by hour and save one dataset for each hour to temp file
492
- times, datasets = zip(*dataset.groupby("time", squeeze=False))
490
+ times, datasets = zip(*dataset.groupby("time", squeeze=False), strict=True)
493
491
 
494
492
  # Open ExitStack to control temp_file context manager
495
493
  with ExitStack() as stack:
@@ -920,7 +918,7 @@ class MetDataset(MetBase):
920
918
  KeyError
921
919
  Raises when dataset does not contain variable in ``vars``
922
920
  """
923
- if isinstance(vars, (MetVariable, str)):
921
+ if isinstance(vars, MetVariable | str):
924
922
  vars = (vars,)
925
923
 
926
924
  met_keys: list[str] = []
@@ -1022,7 +1020,7 @@ class MetDataset(MetBase):
1022
1020
 
1023
1021
  @overrides
1024
1022
  def broadcast_coords(self, name: str) -> xr.DataArray:
1025
- da = xr.ones_like(self.data[list(self.data.keys())[0]]) * self.data[name]
1023
+ da = xr.ones_like(self.data[next(iter(self.data.keys()))]) * self.data[name]
1026
1024
  da.name = name
1027
1025
 
1028
1026
  return da
@@ -1074,7 +1072,7 @@ class MetDataset(MetBase):
1074
1072
  coords_vals = [indexes[key].values for key in coords_keys]
1075
1073
  coords_meshes = np.meshgrid(*coords_vals, indexing="ij")
1076
1074
  raveled_coords = (mesh.ravel() for mesh in coords_meshes)
1077
- data = dict(zip(coords_keys, raveled_coords))
1075
+ data = dict(zip(coords_keys, raveled_coords, strict=True))
1078
1076
 
1079
1077
  out = vector_module.GeoVectorDataset(data, copy=False)
1080
1078
  for key, da in self.data.items():
@@ -1865,7 +1863,7 @@ class MetDataArray(MetBase):
1865
1863
  cachestore = cachestore or DiskCacheStore()
1866
1864
  chunks = chunks or {}
1867
1865
  data = _load(hash, cachestore, chunks)
1868
- return cls(data[list(data.data_vars)[0]])
1866
+ return cls(data[next(iter(data.data_vars))])
1869
1867
 
1870
1868
  @property
1871
1869
  def proportion(self) -> float:
@@ -2258,7 +2256,7 @@ class MetDataArray(MetBase):
2258
2256
  -----
2259
2257
  Uses the `scikit-image Marching Cubes <https://scikit-image.org/docs/dev/auto_examples/edges/plot_marching_cubes.html>`_
2260
2258
  algorithm to reconstruct a surface from the point-cloud like arrays.
2261
- """ # noqa: E501
2259
+ """
2262
2260
  try:
2263
2261
  from skimage import measure
2264
2262
  except ModuleNotFoundError as e:
@@ -22,7 +22,7 @@ class MetVariable:
22
22
  - `NCEP Grib v2 Code Table <https://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_doc/grib2_table4-2.shtml>`_
23
23
 
24
24
  Used for defining support parameters in a grib-like fashion.
25
- """ # noqa: E501
25
+ """
26
26
 
27
27
  #: Short variable name.
28
28
  #: Chosen for greatest consistency between data sources.
@@ -11,7 +11,7 @@ import warnings
11
11
  from abc import ABC, abstractmethod
12
12
  from collections.abc import Sequence
13
13
  from dataclasses import dataclass, fields
14
- from typing import Any, NoReturn, TypeVar, Union, overload
14
+ from typing import Any, NoReturn, TypeVar, overload
15
15
 
16
16
  import numpy as np
17
17
  import numpy.typing as npt
@@ -30,13 +30,13 @@ from pycontrails.utils.types import type_guard
30
30
  logger = logging.getLogger(__name__)
31
31
 
32
32
  #: Model input source types
33
- ModelInput = Union[MetDataset, GeoVectorDataset, Flight, Sequence[Flight], None]
33
+ ModelInput = MetDataset | GeoVectorDataset | Flight | Sequence[Flight] | None
34
34
 
35
35
  #: Model output source types
36
- ModelOutput = Union[MetDataArray, MetDataset, GeoVectorDataset, Flight, list[Flight], NoReturn]
36
+ ModelOutput = MetDataArray | MetDataset | GeoVectorDataset | Flight | list[Flight]
37
37
 
38
38
  #: Model attribute source types
39
- SourceType = Union[MetDataset, GeoVectorDataset, Flight, Fleet]
39
+ SourceType = MetDataset | GeoVectorDataset | Flight | Fleet
40
40
 
41
41
  _Source = TypeVar("_Source")
42
42
 
@@ -453,7 +453,7 @@ class Model(ABC):
453
453
  return Fleet.from_seq(source)
454
454
 
455
455
  # Raise error if source is not a MetDataset or GeoVectorDataset
456
- if not isinstance(source, (MetDataset, GeoVectorDataset)):
456
+ if not isinstance(source, MetDataset | GeoVectorDataset):
457
457
  msg = f"Unknown source type: {type(source)}"
458
458
  raise TypeError(msg)
459
459