core-lens 0.1.dev162__tar.gz → 0.1.dev164__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.dev162 → core_lens-0.1.dev164}/PKG-INFO +1 -1
  2. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/src/core_lens/_version.py +2 -2
  3. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/src/core_lens/base/entity.py +8 -2
  4. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/src/core_lens/base/namespaces/plot.py +8 -13
  5. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/.github/ISSUE_TEMPLATE/blank-proposal.yaml +0 -0
  6. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/.github/ISSUE_TEMPLATE/bug-report.yaml +0 -0
  7. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/.github/ISSUE_TEMPLATE/feature-request.yaml +0 -0
  8. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/.github/pull_request_template.md +0 -0
  9. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/.github/workflows/ci.yml +0 -0
  10. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/.github/workflows/gh-pages.yml +0 -0
  11. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/.github/workflows/pre-release.yml +0 -0
  12. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/.github/workflows/release.yml +0 -0
  13. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/.gitignore +0 -0
  14. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/.gitmessage +0 -0
  15. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/.pre-commit-config.yaml +0 -0
  16. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/.python-version +0 -0
  17. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/CONTRIBUTING.md +0 -0
  18. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/LICENSE +0 -0
  19. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/README.md +0 -0
  20. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/SKILLS.md +0 -0
  21. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/benchmarks/README.md +0 -0
  22. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/benchmarks/bench_aoi.py +0 -0
  23. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/benchmarks/bench_export.py +0 -0
  24. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/benchmarks/bench_polars_utils.py +0 -0
  25. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/benchmarks/bench_result.py +0 -0
  26. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/benchmarks/bench_schema.py +0 -0
  27. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/benchmarks/bench_season.py +0 -0
  28. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/benchmarks/bench_spatial.py +0 -0
  29. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/benchmarks/bench_view.py +0 -0
  30. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/benchmarks/run_all.sh +0 -0
  31. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/docs/Makefile +0 -0
  32. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/docs/make.bat +0 -0
  33. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/docs/source/concepts.md +0 -0
  34. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/docs/source/conf.py +0 -0
  35. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/docs/source/export.md +0 -0
  36. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/docs/source/index.rst +0 -0
  37. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/docs/source/intro.md +0 -0
  38. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/docs/source/logging.md +0 -0
  39. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/docs/source/plots.md +0 -0
  40. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/docs/source/plugins.md +0 -0
  41. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/docs/source/queries.md +0 -0
  42. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/docs/source/quickstart.md +0 -0
  43. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/docs/source/stats.md +0 -0
  44. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/examples/demo_mws.py +0 -0
  45. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/examples/demo_tehsil.py +0 -0
  46. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/hooks/mypy.sh +0 -0
  47. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/hooks/no-parquet-outside-fixtures.sh +0 -0
  48. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/hooks/pytest.sh +0 -0
  49. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/pyproject.toml +0 -0
  50. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/src/core_lens/__init__.py +0 -0
  51. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/src/core_lens/__main__.py +0 -0
  52. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/src/core_lens/aoi.py +0 -0
  53. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/src/core_lens/base/__init__.py +0 -0
  54. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/src/core_lens/base/namespaces/__init__.py +0 -0
  55. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/src/core_lens/base/namespaces/stats.py +0 -0
  56. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/src/core_lens/base/result.py +0 -0
  57. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/src/core_lens/base/view.py +0 -0
  58. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/src/core_lens/entities/__init__.py +0 -0
  59. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/src/core_lens/entities/mws.py +0 -0
  60. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/src/core_lens/entities/tehsil.py +0 -0
  61. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/src/core_lens/entities/waterbody.py +0 -0
  62. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/src/core_lens/export/__init__.py +0 -0
  63. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/src/core_lens/export/formats.py +0 -0
  64. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/src/core_lens/py.typed +0 -0
  65. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/src/core_lens/schema/__init__.py +0 -0
  66. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/src/core_lens/schema/detection.py +0 -0
  67. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/src/core_lens/schema/profile.py +0 -0
  68. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/src/core_lens/utils/__init__.py +0 -0
  69. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/src/core_lens/utils/paths.py +0 -0
  70. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/src/core_lens/utils/polars_utils.py +0 -0
  71. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/src/core_lens/utils/season.py +0 -0
  72. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/src/core_lens/utils/spatial.py +0 -0
  73. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/tests/fixtures/generate_fixtures.py +0 -0
  74. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/tests/unit/conftest.py +0 -0
  75. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/tests/unit/test_aoi.py +0 -0
  76. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/tests/unit/test_entities.py +0 -0
  77. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/tests/unit/test_entity.py +0 -0
  78. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/tests/unit/test_export.py +0 -0
  79. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/tests/unit/test_main.py +0 -0
  80. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/tests/unit/test_plot.py +0 -0
  81. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/tests/unit/test_polars_utils.py +0 -0
  82. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/tests/unit/test_profile.py +0 -0
  83. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/tests/unit/test_result.py +0 -0
  84. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/tests/unit/test_schema_detection.py +0 -0
  85. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/tests/unit/test_schema_profile.py +0 -0
  86. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/tests/unit/test_season.py +0 -0
  87. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/tests/unit/test_season_config.py +0 -0
  88. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/tests/unit/test_spatial.py +0 -0
  89. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/tests/unit/test_stats.py +0 -0
  90. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/tests/unit/test_view.py +0 -0
  91. {core_lens-0.1.dev162 → core_lens-0.1.dev164}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: core-lens
3
- Version: 0.1.dev162
3
+ Version: 0.1.dev164
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
@@ -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.dev162'
22
- __version_tuple__ = version_tuple = (0, 1, 'dev162')
21
+ __version__ = version = '0.1.dev164'
22
+ __version_tuple__ = version_tuple = (0, 1, 'dev164')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -226,13 +226,15 @@ class BaseEntity(ABC):
226
226
  FileNotFoundError: For *local* paths that do not exist after resolution.
227
227
 
228
228
  """
229
+ import pathlib as _pathlib
230
+
229
231
  # Fully-qualified cloud URI — return as-is.
230
232
  if is_cloud_uri(path):
233
+ if not path.endswith("/") and not _pathlib.Path(path).suffix:
234
+ return path + "/"
231
235
  return path
232
236
 
233
237
  # Relative path — join against data_root (which may itself be a cloud URI).
234
- import pathlib as _pathlib
235
-
236
238
  p = _pathlib.Path(path)
237
239
  if not p.is_absolute():
238
240
  root = (
@@ -244,6 +246,10 @@ class BaseEntity(ABC):
244
246
  else:
245
247
  resolved = str(p)
246
248
 
249
+ # Polars cloud directory scanning requires a trailing slash.
250
+ if is_cloud_uri(resolved) and not resolved.endswith("/") and not p.suffix:
251
+ resolved += "/"
252
+
247
253
  # For local resolved paths only: eager existence check.
248
254
  if not is_cloud_uri(resolved) and not path_exists(resolved):
249
255
  if path_exists(resolved + ".parquet"):
@@ -206,21 +206,16 @@ def _apply_theme(fig: Any, result: "Result", title: str) -> None:
206
206
  fig.title.text_font = "Inter, sans-serif"
207
207
  fig.title.text_font_size = "14pt"
208
208
 
209
- from bokeh.models.annotations import Label
209
+ from bokeh.models.annotations import Title
210
210
 
211
- subtitle = Label(
212
- x=fig.plot_width if hasattr(fig, "plot_width") else 800,
213
- y=0,
214
- x_units="screen",
215
- y_units="screen",
211
+ subtitle = Title(
216
212
  text=f"Entity: {entity_name} | Visualised with Bokeh",
217
213
  text_font_size="9pt",
218
214
  text_color="gray",
219
- x_offset=-8,
220
- y_offset=4,
221
- text_align="right",
215
+ align="right",
216
+ text_font="Inter, sans-serif",
222
217
  )
223
- fig.add_layout(subtitle)
218
+ fig.add_layout(subtitle, "below")
224
219
 
225
220
 
226
221
  class MapWithLegend:
@@ -607,8 +602,8 @@ class PlotNamespace:
607
602
  )
608
603
 
609
604
  if fig.legend:
610
- fig.legend.location = "top_left"
611
605
  fig.legend.click_policy = "hide"
606
+ fig.add_layout(fig.legend[0], "right")
612
607
  _apply_theme(fig, self.result, title)
613
608
  return fig
614
609
 
@@ -720,8 +715,8 @@ class PlotNamespace:
720
715
  alpha=0.7,
721
716
  )
722
717
  if fig.legend:
723
- fig.legend.location = "top_left"
724
718
  fig.legend.click_policy = "hide"
719
+ fig.add_layout(fig.legend[0], "right")
725
720
  _apply_theme(fig, self.result, "Scatter Distribution")
726
721
  return fig
727
722
 
@@ -791,8 +786,8 @@ class PlotNamespace:
791
786
  legend_label=str(entity),
792
787
  )
793
788
  if fig.legend:
794
- fig.legend.location = "top_right"
795
789
  fig.legend.click_policy = "hide"
790
+ fig.add_layout(fig.legend[0], "right")
796
791
  _apply_theme(fig, self.result, "Distribution")
797
792
  return fig
798
793
 
File without changes
File without changes
File without changes
File without changes