core-lens 0.1.dev133__tar.gz → 0.1.dev134__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 (91) hide show
  1. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/PKG-INFO +4 -1
  2. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/pyproject.toml +1 -0
  3. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/src/core_lens/_version.py +2 -2
  4. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/src/core_lens/export/formats.py +43 -13
  5. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/uv.lock +309 -272
  6. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/.github/ISSUE_TEMPLATE/blank-proposal.yaml +0 -0
  7. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/.github/ISSUE_TEMPLATE/bug-report.yaml +0 -0
  8. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/.github/ISSUE_TEMPLATE/feature-request.yaml +0 -0
  9. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/.github/pull_request_template.md +0 -0
  10. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/.github/workflows/ci.yml +0 -0
  11. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/.github/workflows/gh-pages.yml +0 -0
  12. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/.github/workflows/pre-release.yml +0 -0
  13. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/.github/workflows/release.yml +0 -0
  14. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/.gitignore +0 -0
  15. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/.gitmessage +0 -0
  16. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/.pre-commit-config.yaml +0 -0
  17. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/.python-version +0 -0
  18. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/CONTRIBUTING.md +0 -0
  19. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/LICENSE +0 -0
  20. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/README.md +0 -0
  21. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/SKILLS.md +0 -0
  22. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/benchmarks/README.md +0 -0
  23. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/benchmarks/bench_aoi.py +0 -0
  24. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/benchmarks/bench_export.py +0 -0
  25. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/benchmarks/bench_polars_utils.py +0 -0
  26. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/benchmarks/bench_result.py +0 -0
  27. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/benchmarks/bench_schema.py +0 -0
  28. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/benchmarks/bench_season.py +0 -0
  29. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/benchmarks/bench_spatial.py +0 -0
  30. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/benchmarks/bench_view.py +0 -0
  31. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/benchmarks/run_all.sh +0 -0
  32. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/docs/Makefile +0 -0
  33. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/docs/make.bat +0 -0
  34. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/docs/source/concepts.md +0 -0
  35. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/docs/source/conf.py +0 -0
  36. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/docs/source/export.md +0 -0
  37. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/docs/source/index.rst +0 -0
  38. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/docs/source/intro.md +0 -0
  39. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/docs/source/logging.md +0 -0
  40. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/docs/source/plots.md +0 -0
  41. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/docs/source/plugins.md +0 -0
  42. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/docs/source/queries.md +0 -0
  43. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/docs/source/quickstart.md +0 -0
  44. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/docs/source/stats.md +0 -0
  45. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/examples/demo_mws.py +0 -0
  46. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/examples/demo_tehsil.py +0 -0
  47. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/hooks/mypy.sh +0 -0
  48. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/hooks/no-parquet-outside-fixtures.sh +0 -0
  49. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/hooks/pytest.sh +0 -0
  50. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/src/core_lens/__init__.py +0 -0
  51. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/src/core_lens/__main__.py +0 -0
  52. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/src/core_lens/aoi.py +0 -0
  53. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/src/core_lens/base/__init__.py +0 -0
  54. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/src/core_lens/base/entity.py +0 -0
  55. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/src/core_lens/base/namespaces/__init__.py +0 -0
  56. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/src/core_lens/base/namespaces/plot.py +0 -0
  57. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/src/core_lens/base/namespaces/stats.py +0 -0
  58. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/src/core_lens/base/result.py +0 -0
  59. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/src/core_lens/base/view.py +0 -0
  60. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/src/core_lens/entities/__init__.py +0 -0
  61. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/src/core_lens/entities/mws.py +0 -0
  62. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/src/core_lens/entities/tehsil.py +0 -0
  63. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/src/core_lens/entities/waterbody.py +0 -0
  64. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/src/core_lens/export/__init__.py +0 -0
  65. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/src/core_lens/py.typed +0 -0
  66. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/src/core_lens/schema/__init__.py +0 -0
  67. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/src/core_lens/schema/detection.py +0 -0
  68. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/src/core_lens/schema/profile.py +0 -0
  69. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/src/core_lens/utils/__init__.py +0 -0
  70. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/src/core_lens/utils/paths.py +0 -0
  71. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/src/core_lens/utils/polars_utils.py +0 -0
  72. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/src/core_lens/utils/season.py +0 -0
  73. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/src/core_lens/utils/spatial.py +0 -0
  74. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/tests/fixtures/generate_fixtures.py +0 -0
  75. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/tests/unit/conftest.py +0 -0
  76. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/tests/unit/test_aoi.py +0 -0
  77. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/tests/unit/test_entities.py +0 -0
  78. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/tests/unit/test_entity.py +0 -0
  79. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/tests/unit/test_export.py +0 -0
  80. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/tests/unit/test_main.py +0 -0
  81. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/tests/unit/test_plot.py +0 -0
  82. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/tests/unit/test_polars_utils.py +0 -0
  83. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/tests/unit/test_profile.py +0 -0
  84. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/tests/unit/test_result.py +0 -0
  85. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/tests/unit/test_schema_detection.py +0 -0
  86. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/tests/unit/test_schema_profile.py +0 -0
  87. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/tests/unit/test_season.py +0 -0
  88. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/tests/unit/test_season_config.py +0 -0
  89. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/tests/unit/test_spatial.py +0 -0
  90. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/tests/unit/test_stats.py +0 -0
  91. {core_lens-0.1.dev133 → core_lens-0.1.dev134}/tests/unit/test_view.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: core-lens
3
- Version: 0.1.dev133
3
+ Version: 0.1.dev134
4
4
  Summary: Query, analyse, and visualise CoreStack's microwatershed and Earth science data through a clean, composable Python API.
5
5
  Project-URL: Homepage, https://github.com/ApoorvaKashyap/core-lens
6
6
  Project-URL: Issues, https://github.com/ApoorvaKashyap/core-lens/issues
@@ -34,6 +34,7 @@ Requires-Dist: matplotlib<4,>=3.10.9; extra == 'full'
34
34
  Requires-Dist: polars<2,>=1.39.0; extra == 'full'
35
35
  Requires-Dist: pyarrow<25,>=23.0.0; extra == 'full'
36
36
  Requires-Dist: pydantic<3,>=2.13.3; extra == 'full'
37
+ Requires-Dist: pyogrio<1,>=0.10.0; extra == 'full'
37
38
  Requires-Dist: pyproj<4,>=3.7.2; extra == 'full'
38
39
  Requires-Dist: scipy<2,>=1.17.1; extra == 'full'
39
40
  Requires-Dist: shapely<3,>=2.1.2; extra == 'full'
@@ -52,6 +53,7 @@ Requires-Dist: matplotlib<4,>=3.10.9; extra == 'full-gpu'
52
53
  Requires-Dist: polars<2,>=1.39.0; extra == 'full-gpu'
53
54
  Requires-Dist: pyarrow<25,>=23.0.0; extra == 'full-gpu'
54
55
  Requires-Dist: pydantic<3,>=2.13.3; extra == 'full-gpu'
56
+ Requires-Dist: pyogrio<1,>=0.10.0; extra == 'full-gpu'
55
57
  Requires-Dist: pyproj<4,>=3.7.2; extra == 'full-gpu'
56
58
  Requires-Dist: scipy<2,>=1.17.1; extra == 'full-gpu'
57
59
  Requires-Dist: shapely<3,>=2.1.2; extra == 'full-gpu'
@@ -72,6 +74,7 @@ Requires-Dist: loguru>=0.7.3; extra == 'spatial'
72
74
  Requires-Dist: polars<2,>=1.39.0; extra == 'spatial'
73
75
  Requires-Dist: pyarrow<25,>=23.0.0; extra == 'spatial'
74
76
  Requires-Dist: pydantic<3,>=2.13.3; extra == 'spatial'
77
+ Requires-Dist: pyogrio<1,>=0.10.0; extra == 'spatial'
75
78
  Requires-Dist: pyproj<4,>=3.7.2; extra == 'spatial'
76
79
  Requires-Dist: shapely<3,>=2.1.2; extra == 'spatial'
77
80
  Provides-Extra: stats
@@ -57,6 +57,7 @@ spatial = [
57
57
  "geopandas>=1.1.3,<2",
58
58
  "shapely>=2.1.2,<3",
59
59
  "pyproj>=3.7.2,<4",
60
+ "pyogrio>=0.10.0,<1",
60
61
  ]
61
62
  viz = [
62
63
  "core-lens[core]",
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.1.dev133'
22
- __version_tuple__ = version_tuple = (0, 1, 'dev133')
21
+ __version__ = version = '0.1.dev134'
22
+ __version_tuple__ = version_tuple = (0, 1, 'dev134')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -187,20 +187,50 @@ def geojson(result: "Result", path: str | pathlib.Path, **kwargs: Any) -> None:
187
187
  "Call .with_geometry() first to join the static geometry column before exporting to geojson."
188
188
  )
189
189
 
190
- gdf = result.gdf()
190
+ geom_col = result.entity.geometry_col
191
+ data = result.data
192
+
193
+ driver = kwargs.pop("driver", "GeoJSON")
194
+ is_seq = driver == "GeoJSONSeq"
195
+
196
+ if kwargs:
197
+ from loguru import logger
198
+
199
+ logger.warning(
200
+ "geojson() now uses a custom streaming Polars writer. "
201
+ "Driver-specific kwargs ({}) are ignored.",
202
+ list(kwargs.keys()),
203
+ )
191
204
 
192
- # Resolve write engine: prefer pyogrio (C-backed, no GDAL Python overhead),
193
- # fall back to fiona if not installed.
194
- engine = kwargs.pop("engine", None)
195
- if engine is None:
196
- try:
197
- import pyogrio as _ # type: ignore[import-untyped] # noqa: F401
205
+ import shapely
206
+ import tempfile
198
207
 
199
- engine = "pyogrio"
200
- except ModuleNotFoundError:
201
- engine = "fiona"
208
+ wkb_arr = data[geom_col].to_numpy()
209
+ geoms = shapely.from_wkb(wkb_arr)
210
+ geom_strs = shapely.to_geojson(geoms)
202
211
 
203
- # Always write as GeoJSON unless the caller overrides driver.
204
- kwargs.setdefault("driver", "GeoJSON")
212
+ with tempfile.NamedTemporaryFile(mode="w+") as tmp:
213
+ data.drop(geom_col).write_ndjson(tmp.name)
214
+ tmp.seek(0)
205
215
 
206
- gdf.to_file(path, engine=engine, **kwargs)
216
+ with open(path, "w") as out:
217
+ if not is_seq:
218
+ out.write('{"type": "FeatureCollection", "features": [\n')
219
+
220
+ first = True
221
+ for i, prop_json_str in enumerate(tmp):
222
+ if not first:
223
+ out.write("\n" if is_seq else ",\n")
224
+ else:
225
+ first = False
226
+
227
+ # construct the Feature JSON manually to avoid parsing/re-serialising
228
+ out.write(
229
+ f'{{"type": "Feature", "geometry": {geom_strs[i]}, '
230
+ f'"properties": {prop_json_str.strip()}}}'
231
+ )
232
+
233
+ if not is_seq:
234
+ out.write("\n]}\n")
235
+ else:
236
+ out.write("\n")