forcingkit 0.7.0__tar.gz → 0.7.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. {forcingkit-0.7.0 → forcingkit-0.7.1}/PKG-INFO +1 -1
  2. {forcingkit-0.7.0 → forcingkit-0.7.1}/docs/source/conf.py +1 -1
  3. {forcingkit-0.7.0 → forcingkit-0.7.1}/pyproject.toml +1 -1
  4. {forcingkit-0.7.0 → forcingkit-0.7.1}/src/forcingkit/fetchers/hrrr.py +7 -10
  5. {forcingkit-0.7.0 → forcingkit-0.7.1}/uv.lock +1 -1
  6. {forcingkit-0.7.0 → forcingkit-0.7.1}/.agents/forcingkit.md +0 -0
  7. {forcingkit-0.7.0 → forcingkit-0.7.1}/.claude/CLAUDE.md +0 -0
  8. {forcingkit-0.7.0 → forcingkit-0.7.1}/.env.template +0 -0
  9. {forcingkit-0.7.0 → forcingkit-0.7.1}/.github/copilot-instructions.md +0 -0
  10. {forcingkit-0.7.0 → forcingkit-0.7.1}/.github/workflows/docs.yml +0 -0
  11. {forcingkit-0.7.0 → forcingkit-0.7.1}/.github/workflows/publish.yml +0 -0
  12. {forcingkit-0.7.0 → forcingkit-0.7.1}/.github/workflows/tests.yml +0 -0
  13. {forcingkit-0.7.0 → forcingkit-0.7.1}/.gitignore +0 -0
  14. {forcingkit-0.7.0 → forcingkit-0.7.1}/.markdownlint.yaml +0 -0
  15. {forcingkit-0.7.0 → forcingkit-0.7.1}/.pre-commit-config.yaml +0 -0
  16. {forcingkit-0.7.0 → forcingkit-0.7.1}/.python-version +0 -0
  17. {forcingkit-0.7.0 → forcingkit-0.7.1}/AGENTS.md +0 -0
  18. {forcingkit-0.7.0 → forcingkit-0.7.1}/CONTRIBUTING.md +0 -0
  19. {forcingkit-0.7.0 → forcingkit-0.7.1}/Dockerfile +0 -0
  20. {forcingkit-0.7.0 → forcingkit-0.7.1}/LICENSE +0 -0
  21. {forcingkit-0.7.0 → forcingkit-0.7.1}/README.md +0 -0
  22. {forcingkit-0.7.0 → forcingkit-0.7.1}/docker-compose.yml +0 -0
  23. {forcingkit-0.7.0 → forcingkit-0.7.1}/docs/Makefile +0 -0
  24. {forcingkit-0.7.0 → forcingkit-0.7.1}/docs/make.bat +0 -0
  25. {forcingkit-0.7.0 → forcingkit-0.7.1}/docs/requirements-docs.txt +0 -0
  26. {forcingkit-0.7.0 → forcingkit-0.7.1}/docs/source/_extra/CNAME +0 -0
  27. {forcingkit-0.7.0 → forcingkit-0.7.1}/docs/source/_static/custom.css +0 -0
  28. {forcingkit-0.7.0 → forcingkit-0.7.1}/docs/source/_static/forcingkit-noreaster-wind.gif +0 -0
  29. {forcingkit-0.7.0 → forcingkit-0.7.1}/docs/source/atmospheric_forcing.rst +0 -0
  30. {forcingkit-0.7.0 → forcingkit-0.7.1}/docs/source/fetchers.rst +0 -0
  31. {forcingkit-0.7.0 → forcingkit-0.7.1}/docs/source/hycom.rst +0 -0
  32. {forcingkit-0.7.0 → forcingkit-0.7.1}/docs/source/index.rst +0 -0
  33. {forcingkit-0.7.0 → forcingkit-0.7.1}/docs/source/necofs.rst +0 -0
  34. {forcingkit-0.7.0 → forcingkit-0.7.1}/docs/source/nyofs.rst +0 -0
  35. {forcingkit-0.7.0 → forcingkit-0.7.1}/docs/source/rivers.rst +0 -0
  36. {forcingkit-0.7.0 → forcingkit-0.7.1}/docs/source/roadmap.rst +0 -0
  37. {forcingkit-0.7.0 → forcingkit-0.7.1}/docs/source/sources.rst +0 -0
  38. {forcingkit-0.7.0 → forcingkit-0.7.1}/main.py +0 -0
  39. {forcingkit-0.7.0 → forcingkit-0.7.1}/service/__init__.py +0 -0
  40. {forcingkit-0.7.0 → forcingkit-0.7.1}/service/forcingkit_serve/__init__.py +0 -0
  41. {forcingkit-0.7.0 → forcingkit-0.7.1}/service/forcingkit_serve/main.py +0 -0
  42. {forcingkit-0.7.0 → forcingkit-0.7.1}/service/forcingkit_serve/routers/bathymetry.py +0 -0
  43. {forcingkit-0.7.0 → forcingkit-0.7.1}/service/forcingkit_serve/routers/plotly_api.py +0 -0
  44. {forcingkit-0.7.0 → forcingkit-0.7.1}/service/forcingkit_serve/routers/removed.py +0 -0
  45. {forcingkit-0.7.0 → forcingkit-0.7.1}/service/forcingkit_serve/routers/viewer.py +0 -0
  46. {forcingkit-0.7.0 → forcingkit-0.7.1}/service/run_server.py +0 -0
  47. {forcingkit-0.7.0 → forcingkit-0.7.1}/src/forcingkit/__init__.py +0 -0
  48. {forcingkit-0.7.0 → forcingkit-0.7.1}/src/forcingkit/data/rivers/northeast_us.json +0 -0
  49. {forcingkit-0.7.0 → forcingkit-0.7.1}/src/forcingkit/dispatcher.py +0 -0
  50. {forcingkit-0.7.0 → forcingkit-0.7.1}/src/forcingkit/fetchers/coastwatch.py +0 -0
  51. {forcingkit-0.7.0 → forcingkit-0.7.1}/src/forcingkit/fetchers/dbofs.py +0 -0
  52. {forcingkit-0.7.0 → forcingkit-0.7.1}/src/forcingkit/fetchers/erddap.py +0 -0
  53. {forcingkit-0.7.0 → forcingkit-0.7.1}/src/forcingkit/fetchers/hrrr_atmosphere.py +0 -0
  54. {forcingkit-0.7.0 → forcingkit-0.7.1}/src/forcingkit/fetchers/hrrr_points.py +0 -0
  55. {forcingkit-0.7.0 → forcingkit-0.7.1}/src/forcingkit/fetchers/hycom.py +0 -0
  56. {forcingkit-0.7.0 → forcingkit-0.7.1}/src/forcingkit/fetchers/hydrography.py +0 -0
  57. {forcingkit-0.7.0 → forcingkit-0.7.1}/src/forcingkit/fetchers/ndbc.py +0 -0
  58. {forcingkit-0.7.0 → forcingkit-0.7.1}/src/forcingkit/fetchers/necofs.py +0 -0
  59. {forcingkit-0.7.0 → forcingkit-0.7.1}/src/forcingkit/fetchers/noaa.py +0 -0
  60. {forcingkit-0.7.0 → forcingkit-0.7.1}/src/forcingkit/fetchers/nyofs.py +0 -0
  61. {forcingkit-0.7.0 → forcingkit-0.7.1}/src/forcingkit/fetchers/usgs.py +0 -0
  62. {forcingkit-0.7.0 → forcingkit-0.7.1}/src/forcingkit/fetchers/usgs_rivers.py +0 -0
  63. {forcingkit-0.7.0 → forcingkit-0.7.1}/src/forcingkit/settings.py +0 -0
  64. {forcingkit-0.7.0 → forcingkit-0.7.1}/src/forcingkit/zarr_stream.py +0 -0
  65. {forcingkit-0.7.0 → forcingkit-0.7.1}/static/app.js +0 -0
  66. {forcingkit-0.7.0 → forcingkit-0.7.1}/static/favicon.ico +0 -0
  67. {forcingkit-0.7.0 → forcingkit-0.7.1}/static/favicon.svg +0 -0
  68. {forcingkit-0.7.0 → forcingkit-0.7.1}/static/index.html +0 -0
  69. {forcingkit-0.7.0 → forcingkit-0.7.1}/static/logo.svg +0 -0
  70. {forcingkit-0.7.0 → forcingkit-0.7.1}/static/preview3d.js +0 -0
  71. {forcingkit-0.7.0 → forcingkit-0.7.1}/static/styles.css +0 -0
  72. {forcingkit-0.7.0 → forcingkit-0.7.1}/tests/__init__.py +0 -0
  73. {forcingkit-0.7.0 → forcingkit-0.7.1}/tests/integration/test_auth.py +0 -0
  74. {forcingkit-0.7.0 → forcingkit-0.7.1}/tests/integration/test_erddap_fetch.py +0 -0
  75. {forcingkit-0.7.0 → forcingkit-0.7.1}/tests/integration/test_nyofs_obc_fetch.py +0 -0
  76. {forcingkit-0.7.0 → forcingkit-0.7.1}/tests/integration/test_obc_offshore_nj.py +0 -0
  77. {forcingkit-0.7.0 → forcingkit-0.7.1}/tests/integration/test_ofs_archive_paths.py +0 -0
  78. {forcingkit-0.7.0 → forcingkit-0.7.1}/tests/integration/test_s3_roms_fetchers.py +0 -0
  79. {forcingkit-0.7.0 → forcingkit-0.7.1}/tests/scripts/inspect_dem.py +0 -0
  80. {forcingkit-0.7.0 → forcingkit-0.7.1}/tests/scripts/inspect_grib.py +0 -0
  81. {forcingkit-0.7.0 → forcingkit-0.7.1}/tests/scripts/inspect_zarr.py +0 -0
  82. {forcingkit-0.7.0 → forcingkit-0.7.1}/tests/unit/test_coastwatch.py +0 -0
  83. {forcingkit-0.7.0 → forcingkit-0.7.1}/tests/unit/test_dbofs.py +0 -0
  84. {forcingkit-0.7.0 → forcingkit-0.7.1}/tests/unit/test_dispatcher.py +0 -0
  85. {forcingkit-0.7.0 → forcingkit-0.7.1}/tests/unit/test_hrrr_atm.py +0 -0
  86. {forcingkit-0.7.0 → forcingkit-0.7.1}/tests/unit/test_hrrr_idx.py +0 -0
  87. {forcingkit-0.7.0 → forcingkit-0.7.1}/tests/unit/test_hrrr_points.py +0 -0
  88. {forcingkit-0.7.0 → forcingkit-0.7.1}/tests/unit/test_hycom.py +0 -0
  89. {forcingkit-0.7.0 → forcingkit-0.7.1}/tests/unit/test_main.py +0 -0
  90. {forcingkit-0.7.0 → forcingkit-0.7.1}/tests/unit/test_ndbc.py +0 -0
  91. {forcingkit-0.7.0 → forcingkit-0.7.1}/tests/unit/test_necofs_parent.py +0 -0
  92. {forcingkit-0.7.0 → forcingkit-0.7.1}/tests/unit/test_noaa_currents.py +0 -0
  93. {forcingkit-0.7.0 → forcingkit-0.7.1}/tests/unit/test_noaa_datum.py +0 -0
  94. {forcingkit-0.7.0 → forcingkit-0.7.1}/tests/unit/test_nyofs.py +0 -0
  95. {forcingkit-0.7.0 → forcingkit-0.7.1}/tests/unit/test_obc_donor_report.py +0 -0
  96. {forcingkit-0.7.0 → forcingkit-0.7.1}/tests/unit/test_obc_pipeline.py +0 -0
  97. {forcingkit-0.7.0 → forcingkit-0.7.1}/tests/unit/test_removed_routes.py +0 -0
  98. {forcingkit-0.7.0 → forcingkit-0.7.1}/tests/unit/test_settings.py +0 -0
  99. {forcingkit-0.7.0 → forcingkit-0.7.1}/tests/unit/test_usgs.py +0 -0
  100. {forcingkit-0.7.0 → forcingkit-0.7.1}/tests/unit/test_usgs_rivers.py +0 -0
  101. {forcingkit-0.7.0 → forcingkit-0.7.1}/tests/unit/test_zarr_stream.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: forcingkit
3
- Version: 0.7.0
3
+ Version: 0.7.1
4
4
  Summary: Spatiotemporal forcing for computational Earth-system models: selects, regrids and serves model-ready time series with provenance.
5
5
  Project-URL: Documentation, https://forcingkit.docs.lhzn.io
6
6
  Project-URL: Issues, https://github.com/lhzn-io/forcingkit/issues
@@ -9,7 +9,7 @@ sys.path.insert(0, os.path.abspath("../../src"))
9
9
  project = "forcingkit"
10
10
  copyright = "2026, Long Horizon Observatory"
11
11
  author = "Daniel Fry"
12
- release = "0.7.0"
12
+ release = "0.7.1"
13
13
 
14
14
  extensions = [
15
15
  "sphinx.ext.autodoc",
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "forcingkit"
7
- version = "0.7.0"
7
+ version = "0.7.1"
8
8
  description = "Spatiotemporal forcing for computational Earth-system models: selects, regrids and serves model-ready time series with provenance."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -57,16 +57,13 @@ def _fetch_s3_byte_ranges(
57
57
  Download specific byte ranges from an S3 object and concatenate into a
58
58
  single valid GRIB2 file. Each GRIB2 message is self-contained, so
59
59
  concatenating selected messages produces a valid file.
60
+
61
+ Each range is one ranged GET of exactly its bytes. A buffered file
62
+ (``fs.open`` then ``seek`` and ``read``) fetches whole blocks with
63
+ read-ahead, which for 1 to 2 MB messages downloaded about 38 times the
64
+ bytes needed (4.0 GB for 106 MB of messages in one HRRR cycle).
60
65
  """
61
66
  with open(output_path, "wb") as f:
62
67
  for start, end in ranges:
63
- if end is not None:
64
- length = end - start
65
- with fs.open(s3_path, "rb") as s3f:
66
- s3f.seek(start)
67
- f.write(s3f.read(length))
68
- else:
69
- # Read from start to EOF
70
- with fs.open(s3_path, "rb") as s3f:
71
- s3f.seek(start)
72
- f.write(s3f.read())
68
+ # end=None reads to the end of the object (the file's last message)
69
+ f.write(fs.cat_file(s3_path, start=start, end=end))
@@ -873,7 +873,7 @@ wheels = [
873
873
 
874
874
  [[package]]
875
875
  name = "forcingkit"
876
- version = "0.7.0"
876
+ version = "0.7.1"
877
877
  source = { editable = "." }
878
878
  dependencies = [
879
879
  { name = "bottleneck" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes