lunar-toolkit 0.1.0.dev7__tar.gz → 0.1.0.dev13__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 (94) hide show
  1. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/PKG-INFO +2 -1
  2. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/README.md +1 -0
  3. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/cli/app.py +28 -4
  4. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/cli/serve.py +13 -0
  5. lunar_toolkit-0.1.0.dev13/lunar_toolkit/static/basemaps/lola_dem_global.tif +0 -0
  6. lunar_toolkit-0.1.0.dev13/lunar_toolkit/static/basemaps/lola_dem_north.tif +0 -0
  7. lunar_toolkit-0.1.0.dev13/lunar_toolkit/static/basemaps/lola_dem_south.tif +0 -0
  8. lunar_toolkit-0.1.0.dev13/lunar_toolkit/static/basemaps/lola_shade_global.jpg +0 -0
  9. lunar_toolkit-0.1.0.dev13/lunar_toolkit/static/basemaps/lola_shade_north.jpg +0 -0
  10. lunar_toolkit-0.1.0.dev13/lunar_toolkit/static/basemaps/lola_shade_south.jpg +0 -0
  11. lunar_toolkit-0.1.0.dev13/lunar_toolkit/static/basemaps/manifest.json +11 -0
  12. lunar_toolkit-0.1.0.dev13/lunar_toolkit/static/basemaps/wac_global.jpg +0 -0
  13. lunar_toolkit-0.1.0.dev13/lunar_toolkit/static/basemaps/wac_north.jpg +0 -0
  14. lunar_toolkit-0.1.0.dev13/lunar_toolkit/static/basemaps/wac_south.jpg +0 -0
  15. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/static/index.html +536 -19
  16. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit.egg-info/PKG-INFO +2 -1
  17. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit.egg-info/SOURCES.txt +10 -0
  18. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/pyproject.toml +3 -3
  19. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/tests/test_app.py +12 -0
  20. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/tests/test_static.py +2 -0
  21. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/LICENSE +0 -0
  22. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/__init__.py +0 -0
  23. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/asp.py +0 -0
  24. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/cli/__init__.py +0 -0
  25. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/cli/_jobs.py +0 -0
  26. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/cli/_status.py +0 -0
  27. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/cli/_utils.py +0 -0
  28. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/cli/build_db.py +0 -0
  29. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/cli/download.py +0 -0
  30. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/cli/kaguya.py +0 -0
  31. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/cli/ode_search.py +0 -0
  32. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/cli/pairs.py +0 -0
  33. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/cli/process.py +0 -0
  34. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/cli/query.py +0 -0
  35. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/cli/reference.py +0 -0
  36. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/cli/search.py +0 -0
  37. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/cli/sfs.py +0 -0
  38. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/cli/sfs_report.py +0 -0
  39. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/cli/shadowcam.py +0 -0
  40. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/cli/stereo.py +0 -0
  41. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/cli/workspace.py +0 -0
  42. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/config.py +0 -0
  43. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/constants.py +0 -0
  44. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/csm.py +0 -0
  45. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/downloader.py +0 -0
  46. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/geometry.py +0 -0
  47. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/isis.py +0 -0
  48. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/kaguya/__init__.py +0 -0
  49. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/kaguya/mi.py +0 -0
  50. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/kaguya/tc.py +0 -0
  51. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/lroc/__init__.py +0 -0
  52. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/lroc/cumindex.py +0 -0
  53. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/lroc/nac.py +0 -0
  54. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/observation.py +0 -0
  55. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/ode.py +0 -0
  56. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/provenance.py +0 -0
  57. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/reference.py +0 -0
  58. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/selection.py +0 -0
  59. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/sfs.py +0 -0
  60. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/sfs_products.py +0 -0
  61. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/sfs_report.py +0 -0
  62. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/shadowcam/__init__.py +0 -0
  63. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/shadowcam/sc.py +0 -0
  64. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/stereo.py +0 -0
  65. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/stereo_dem.py +0 -0
  66. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/tools.py +0 -0
  67. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit/workspace.py +0 -0
  68. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit.egg-info/dependency_links.txt +0 -0
  69. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit.egg-info/entry_points.txt +0 -0
  70. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit.egg-info/requires.txt +0 -0
  71. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/lunar_toolkit.egg-info/top_level.txt +0 -0
  72. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/setup.cfg +0 -0
  73. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/tests/test_aoi.py +0 -0
  74. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/tests/test_build.py +0 -0
  75. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/tests/test_config.py +0 -0
  76. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/tests/test_csm.py +0 -0
  77. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/tests/test_download.py +0 -0
  78. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/tests/test_footprints.py +0 -0
  79. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/tests/test_integration.py +0 -0
  80. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/tests/test_kaguya.py +0 -0
  81. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/tests/test_kaguya_mi.py +0 -0
  82. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/tests/test_lbl.py +0 -0
  83. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/tests/test_ode.py +0 -0
  84. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/tests/test_reference.py +0 -0
  85. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/tests/test_selection.py +0 -0
  86. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/tests/test_sfs.py +0 -0
  87. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/tests/test_sfs_products.py +0 -0
  88. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/tests/test_sfs_report.py +0 -0
  89. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/tests/test_shadowcam.py +0 -0
  90. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/tests/test_stereo.py +0 -0
  91. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/tests/test_tool_env.py +0 -0
  92. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/tests/test_tools.py +0 -0
  93. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/tests/test_update.py +0 -0
  94. {lunar_toolkit-0.1.0.dev7 → lunar_toolkit-0.1.0.dev13}/tests/test_workspace.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lunar-toolkit
3
- Version: 0.1.0.dev7
3
+ Version: 0.1.0.dev13
4
4
  Summary: Find, download and process lunar orbital imagery (LROC, ShadowCam, Kaguya TC) and build stereo and shape-from-shading DEMs with ISIS + ASP
5
5
  License-Expression: BSD-3-Clause
6
6
  Keywords: moon,lroc,shadowcam,kaguya,isis,ames-stereo-pipeline,shape-from-shading,dem
@@ -51,6 +51,7 @@ Dynamic: license-file
51
51
  [![coverage](https://img.shields.io/endpoint?url=https://alexmaietta.github.io/lunar-toolkit/coverage/badge.json)](https://alexmaietta.github.io/lunar-toolkit/coverage/)
52
52
  [![pypi](https://img.shields.io/pypi/v/lunar-toolkit)](https://pypi.org/project/lunar-toolkit/)
53
53
  [![license](https://img.shields.io/badge/license-BSD_3--Clause-blue)](LICENSE)
54
+ [![app](https://img.shields.io/badge/app-open_in_browser-yellow)](https://alexmaietta.github.io/lunar-toolkit/browser/)
54
55
 
55
56
  # Lunar Toolkit
56
57
 
@@ -2,6 +2,7 @@
2
2
  [![coverage](https://img.shields.io/endpoint?url=https://alexmaietta.github.io/lunar-toolkit/coverage/badge.json)](https://alexmaietta.github.io/lunar-toolkit/coverage/)
3
3
  [![pypi](https://img.shields.io/pypi/v/lunar-toolkit)](https://pypi.org/project/lunar-toolkit/)
4
4
  [![license](https://img.shields.io/badge/license-BSD_3--Clause-blue)](LICENSE)
5
+ [![app](https://img.shields.io/badge/app-open_in_browser-yellow)](https://alexmaietta.github.io/lunar-toolkit/browser/)
5
6
 
6
7
  # Lunar Toolkit
7
8
 
@@ -54,7 +54,7 @@ Examples
54
54
 
55
55
  The server runs on this machine (a free port on 127.0.0.1 by default) and stops when
56
56
  the window closes. Window backends, first available wins (--backend auto):
57
- webview pywebview: Qt WebEngine on Linux (pip install PyQt6 PyQt6-WebEngine qtpy,
57
+ webview pywebview: Qt WebEngine on Linux (pip install "lunar-toolkit[app]",
58
58
  or PyGObject + WebKitGTK), Edge WebView2 on Windows, WebKit on macOS
59
59
  chromium Chrome / Chromium / Edge / Brave in --app mode (own profile in the cache dir)
60
60
  browser the default browser (Ctrl-C stops the server)
@@ -128,22 +128,39 @@ def chromium_binary(platform: str | None = None) -> str | None:
128
128
  return None
129
129
 
130
130
 
131
+ INSTALL_HINT = 'pip install "lunar-toolkit[app]"'
132
+
133
+
131
134
  def choose_backend(requested: str = "auto", platform: str | None = None) -> tuple[str, str | None]:
132
135
  """``(backend, detail)``: the pywebview GUI name, the Chromium binary, or None for the browser."""
133
136
  if requested in ("auto", "webview"):
134
137
  gui = webview_gui(platform)
135
138
  if gui:
136
139
  return "webview", gui
137
- if requested in ("auto", "chromium", "webview"):
140
+ if requested in ("auto", "chromium"):
138
141
  binary = chromium_binary(platform)
139
142
  if binary:
140
143
  return "chromium", binary
141
144
  return "browser", None
142
145
 
143
146
 
147
+ def _quiet_qt_exit() -> None:
148
+ """Drop Qt WebEngine's harmless "Release of profile requested" warning on window close."""
149
+ from qtpy.QtCore import qInstallMessageHandler
150
+
151
+ def handler(mode: Any, context: Any, message: str | None) -> None:
152
+ if message and "WebEnginePage still not deleted" not in message:
153
+ sys.stderr.write(message + "\n")
154
+
155
+ qInstallMessageHandler(handler)
156
+
157
+
144
158
  def _run_webview(url: str, gui: str) -> None:
145
159
  import webview
146
160
 
161
+ if gui == "qt":
162
+ _quiet_qt_exit()
163
+
147
164
  from ..constants import DEFAULT_CACHE_DIR
148
165
 
149
166
  webview.create_window(TITLE, url, width=SIZE[0], height=SIZE[1], min_size=MIN_SIZE)
@@ -171,6 +188,12 @@ def _run_chromium(url: str, binary: str) -> None:
171
188
  def run(args: argparse.Namespace) -> int:
172
189
  from .serve import make_server, print_banner
173
190
 
191
+ backend, detail = choose_backend(args.backend)
192
+ if args.backend == "webview" and backend != "webview":
193
+ print(
194
+ f"No native window toolkit for pywebview here; {INSTALL_HINT}, or use --backend chromium / browser."
195
+ )
196
+ return 1
174
197
  try:
175
198
  server, cfg = make_server(args)
176
199
  except (ValueError, OSError) as exc:
@@ -179,7 +202,8 @@ def run(args: argparse.Namespace) -> int:
179
202
  url = print_banner(server, cfg, args.host, TITLE)
180
203
  thread = threading.Thread(target=server.serve_forever, name="lunar-server", daemon=True)
181
204
  thread.start()
182
- backend, detail = choose_backend(args.backend)
205
+ if backend != "webview" and args.backend == "auto":
206
+ print(f" note : no native window toolkit; {INSTALL_HINT} for one")
183
207
  try:
184
208
  if backend == "webview" and detail:
185
209
  print(f" window : pywebview ({detail})")
@@ -193,7 +217,7 @@ def run(args: argparse.Namespace) -> int:
193
217
  print(f" window : {Path(detail).name} --app")
194
218
  _run_chromium(url, detail)
195
219
  return 0
196
- print(" window : none found (pip install PyQt6 PyQt6-WebEngine qtpy); opening a browser tab")
220
+ print(" window : no Chrome / Chromium / Edge either; opening a browser tab")
197
221
  print(" Ctrl-C to stop.\n")
198
222
  webbrowser.open(url)
199
223
  while thread.is_alive():
@@ -29,6 +29,7 @@ COMMAND = "serve"
29
29
 
30
30
  _STATIC_DIR = Path(__file__).parent.parent / "static"
31
31
  _INDEX = _STATIC_DIR / "index.html"
32
+ _BASEMAPS = _STATIC_DIR / "basemaps"
32
33
 
33
34
  _IMAGE_TYPES = {
34
35
  ".tif": "image/tiff",
@@ -44,7 +45,11 @@ _RELAY_HOSTS = (
44
45
  "pds.lroc.im-ldi.com",
45
46
  "pds.shadowcam.im-ldi.com",
46
47
  "data.darts.isas.jaxa.jp",
48
+ "pgda.gsfc.nasa.gov",
47
49
  )
50
+ # Hosts relayed only under these path prefixes (PGDA: the LOLA DEMs for the map's contours)
51
+ _RELAY_PATHS = {"pgda.gsfc.nasa.gov": "/data/LOLA_20mpp/"}
52
+ _BASEMAP_TYPES = {**_IMAGE_TYPES, ".json": "application/json"}
48
53
  _MAX_LISTED_IMAGES = 2000
49
54
  RELAY_MAX = 6
50
55
  RELAY_WAIT = 30.0
@@ -189,6 +194,7 @@ def _relay_allowed(url: str) -> bool:
189
194
  and port is None
190
195
  and not u.username
191
196
  and Path(u.path).suffix.lower() in _IMAGE_TYPES
197
+ and u.path.startswith(_RELAY_PATHS.get(u.hostname, "/"))
192
198
  )
193
199
 
194
200
 
@@ -382,6 +388,13 @@ class LunarHandler(http.server.BaseHTTPRequestHandler):
382
388
  },
383
389
  body,
384
390
  )
391
+ elif path.startswith("/basemaps/"):
392
+ name = path[len("/basemaps/") :]
393
+ ctype = _BASEMAP_TYPES.get(Path(name).suffix.lower())
394
+ if not ctype or "/" in name or name.startswith("."):
395
+ self._send_code(404)
396
+ return
397
+ self._serve(_BASEMAPS / name, ctype, body)
385
398
  elif path == "/api/images":
386
399
  self._json(_list_images(cfg.images_dir) if cfg.images_dir else [], body)
387
400
  elif path.startswith("/images/") and cfg.images_dir is not None:
@@ -0,0 +1,11 @@
1
+ {
2
+ "wac_global": {"file": "wac_global.jpg", "proj": "eqc", "bounds": [-180, -90, 180, 90]},
3
+ "lola_shade_global": {"file": "lola_shade_global.jpg", "proj": "eqc", "bounds": [-180, -90, 180, 90]},
4
+ "lola_dem_global": {"file": "lola_dem_global.tif", "proj": "eqc"},
5
+ "wac_south": {"file": "wac_south.jpg", "proj": "S", "bounds": [-609600, -609600, 609600, 609600]},
6
+ "wac_north": {"file": "wac_north.jpg", "proj": "N", "bounds": [-609600, -609600, 609600, 609600]},
7
+ "lola_shade_south": {"file": "lola_shade_south.jpg", "proj": "S", "bounds": [-609600, -609600, 609600, 609600]},
8
+ "lola_shade_north": {"file": "lola_shade_north.jpg", "proj": "N", "bounds": [-609600, -609600, 609600, 609600]},
9
+ "lola_dem_south": {"file": "lola_dem_south.tif", "proj": "S"},
10
+ "lola_dem_north": {"file": "lola_dem_north.tif", "proj": "N"}
11
+ }