core-lens 0.1.dev140__tar.gz → 0.1.dev142__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.dev140 → core_lens-0.1.dev142}/PKG-INFO +1 -1
  2. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/src/core_lens/_version.py +2 -2
  3. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/src/core_lens/aoi.py +13 -2
  4. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/src/core_lens/base/entity.py +13 -10
  5. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/src/core_lens/base/view.py +19 -4
  6. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/.github/ISSUE_TEMPLATE/blank-proposal.yaml +0 -0
  7. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/.github/ISSUE_TEMPLATE/bug-report.yaml +0 -0
  8. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/.github/ISSUE_TEMPLATE/feature-request.yaml +0 -0
  9. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/.github/pull_request_template.md +0 -0
  10. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/.github/workflows/ci.yml +0 -0
  11. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/.github/workflows/gh-pages.yml +0 -0
  12. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/.github/workflows/pre-release.yml +0 -0
  13. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/.github/workflows/release.yml +0 -0
  14. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/.gitignore +0 -0
  15. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/.gitmessage +0 -0
  16. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/.pre-commit-config.yaml +0 -0
  17. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/.python-version +0 -0
  18. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/CONTRIBUTING.md +0 -0
  19. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/LICENSE +0 -0
  20. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/README.md +0 -0
  21. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/SKILLS.md +0 -0
  22. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/benchmarks/README.md +0 -0
  23. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/benchmarks/bench_aoi.py +0 -0
  24. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/benchmarks/bench_export.py +0 -0
  25. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/benchmarks/bench_polars_utils.py +0 -0
  26. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/benchmarks/bench_result.py +0 -0
  27. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/benchmarks/bench_schema.py +0 -0
  28. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/benchmarks/bench_season.py +0 -0
  29. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/benchmarks/bench_spatial.py +0 -0
  30. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/benchmarks/bench_view.py +0 -0
  31. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/benchmarks/run_all.sh +0 -0
  32. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/docs/Makefile +0 -0
  33. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/docs/make.bat +0 -0
  34. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/docs/source/concepts.md +0 -0
  35. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/docs/source/conf.py +0 -0
  36. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/docs/source/export.md +0 -0
  37. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/docs/source/index.rst +0 -0
  38. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/docs/source/intro.md +0 -0
  39. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/docs/source/logging.md +0 -0
  40. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/docs/source/plots.md +0 -0
  41. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/docs/source/plugins.md +0 -0
  42. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/docs/source/queries.md +0 -0
  43. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/docs/source/quickstart.md +0 -0
  44. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/docs/source/stats.md +0 -0
  45. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/examples/demo_mws.py +0 -0
  46. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/examples/demo_tehsil.py +0 -0
  47. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/hooks/mypy.sh +0 -0
  48. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/hooks/no-parquet-outside-fixtures.sh +0 -0
  49. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/hooks/pytest.sh +0 -0
  50. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/pyproject.toml +0 -0
  51. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/src/core_lens/__init__.py +0 -0
  52. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/src/core_lens/__main__.py +0 -0
  53. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/src/core_lens/base/__init__.py +0 -0
  54. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/src/core_lens/base/namespaces/__init__.py +0 -0
  55. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/src/core_lens/base/namespaces/plot.py +0 -0
  56. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/src/core_lens/base/namespaces/stats.py +0 -0
  57. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/src/core_lens/base/result.py +0 -0
  58. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/src/core_lens/entities/__init__.py +0 -0
  59. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/src/core_lens/entities/mws.py +0 -0
  60. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/src/core_lens/entities/tehsil.py +0 -0
  61. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/src/core_lens/entities/waterbody.py +0 -0
  62. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/src/core_lens/export/__init__.py +0 -0
  63. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/src/core_lens/export/formats.py +0 -0
  64. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/src/core_lens/py.typed +0 -0
  65. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/src/core_lens/schema/__init__.py +0 -0
  66. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/src/core_lens/schema/detection.py +0 -0
  67. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/src/core_lens/schema/profile.py +0 -0
  68. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/src/core_lens/utils/__init__.py +0 -0
  69. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/src/core_lens/utils/paths.py +0 -0
  70. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/src/core_lens/utils/polars_utils.py +0 -0
  71. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/src/core_lens/utils/season.py +0 -0
  72. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/src/core_lens/utils/spatial.py +0 -0
  73. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/tests/fixtures/generate_fixtures.py +0 -0
  74. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/tests/unit/conftest.py +0 -0
  75. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/tests/unit/test_aoi.py +0 -0
  76. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/tests/unit/test_entities.py +0 -0
  77. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/tests/unit/test_entity.py +0 -0
  78. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/tests/unit/test_export.py +0 -0
  79. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/tests/unit/test_main.py +0 -0
  80. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/tests/unit/test_plot.py +0 -0
  81. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/tests/unit/test_polars_utils.py +0 -0
  82. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/tests/unit/test_profile.py +0 -0
  83. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/tests/unit/test_result.py +0 -0
  84. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/tests/unit/test_schema_detection.py +0 -0
  85. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/tests/unit/test_schema_profile.py +0 -0
  86. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/tests/unit/test_season.py +0 -0
  87. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/tests/unit/test_season_config.py +0 -0
  88. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/tests/unit/test_spatial.py +0 -0
  89. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/tests/unit/test_stats.py +0 -0
  90. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/tests/unit/test_view.py +0 -0
  91. {core_lens-0.1.dev140 → core_lens-0.1.dev142}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: core-lens
3
- Version: 0.1.dev140
3
+ Version: 0.1.dev142
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.dev140'
22
- __version_tuple__ = version_tuple = (0, 1, 'dev140')
21
+ __version__ = version = '0.1.dev142'
22
+ __version_tuple__ = version_tuple = (0, 1, 'dev142')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -219,12 +219,23 @@ def _cached_resolve_boundary(
219
219
 
220
220
  lf = pl.scan_parquet(static_path, storage_options=storage_options or None)
221
221
  filter_expr = pl.lit(True)
222
+ schema_types = lf.collect_schema()
222
223
  for col, val in entity_kwargs.items():
223
224
  if col in schema.key_cols or col in schema.extra_static_cols:
225
+ is_list_col = isinstance(schema_types.get(col), pl.List)
224
226
  if isinstance(val, list):
225
- lf = lf.filter(pl.col(col).is_in(val))
227
+ if is_list_col:
228
+ filter_expr = (
229
+ filter_expr
230
+ & pl.col(col).list.eval(pl.element().is_in(val)).list.any()
231
+ )
232
+ else:
233
+ filter_expr = filter_expr & pl.col(col).is_in(val)
226
234
  else:
227
- filter_expr = filter_expr & (pl.col(col) == val)
235
+ if is_list_col:
236
+ filter_expr = filter_expr & pl.col(col).list.contains(val)
237
+ else:
238
+ filter_expr = filter_expr & (pl.col(col) == val)
228
239
 
229
240
  df = lf.filter(filter_expr).select(candidate.key_cols + [geom_col]).collect()
230
241
 
@@ -245,16 +245,19 @@ class BaseEntity(ABC):
245
245
 
246
246
  # For local resolved paths only: eager existence check.
247
247
  if not is_cloud_uri(resolved) and not path_exists(resolved):
248
- logger.error(
249
- "Path resolution failed: '{}' (resolved to {}) does not exist.",
250
- path,
251
- resolved,
252
- )
253
- raise FileNotFoundError(
254
- f"Entity path {path!r} (resolved to {resolved!r}) does not exist. "
255
- "Provide an absolute path or ensure the file exists relative to "
256
- "the AoI data_root directory."
257
- )
248
+ if path_exists(resolved + ".parquet"):
249
+ resolved += ".parquet"
250
+ else:
251
+ logger.error(
252
+ "Path resolution failed: '{}' (resolved to {}) does not exist.",
253
+ path,
254
+ resolved,
255
+ )
256
+ raise FileNotFoundError(
257
+ f"Entity path {path!r} (resolved to {resolved!r}) does not exist. "
258
+ "Provide an absolute path or ensure the file exists relative to "
259
+ "the AoI data_root directory."
260
+ )
258
261
  return resolved
259
262
 
260
263
  @property
@@ -99,16 +99,31 @@ class View:
99
99
  """
100
100
  static = self.entity._resolve(self.entity.static_path)
101
101
 
102
- filter_expr = pl.lit(True)
103
- for col, val in kwargs.items():
104
- filter_expr = filter_expr & (pl.col(col) == val)
105
-
106
102
  lf = scan_with_key_filter(
107
103
  path=static,
108
104
  key_cols=self.entity.key_cols,
109
105
  key_values=self.keys,
110
106
  storage_options=self._storage_options or None,
111
107
  )
108
+ schema_types = lf.collect_schema()
109
+
110
+ filter_expr = pl.lit(True)
111
+ for col, val in kwargs.items():
112
+ is_list_col = isinstance(schema_types.get(col), pl.List)
113
+ if isinstance(val, list):
114
+ if is_list_col:
115
+ filter_expr = (
116
+ filter_expr
117
+ & pl.col(col).list.eval(pl.element().is_in(val)).list.any()
118
+ )
119
+ else:
120
+ filter_expr = filter_expr & pl.col(col).is_in(val)
121
+ else:
122
+ if is_list_col:
123
+ filter_expr = filter_expr & pl.col(col).list.contains(val)
124
+ else:
125
+ filter_expr = filter_expr & (pl.col(col) == val)
126
+
112
127
  keys = lf.filter(filter_expr).select(self.entity.key_cols).collect()
113
128
 
114
129
  return View(
File without changes
File without changes
File without changes
File without changes