Skip to content

Commit 06c11d1

Browse files
committed
Release version 0.16.5
1 parent 12795e4 commit 06c11d1

File tree

14 files changed

+220
-45
lines changed

14 files changed

+220
-45
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,14 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [0.16.5] - 2026-02-04
9+
10+
### Fixed
11+
- Dossier assets are now copied into the dossier output and linked with URL-safe relative paths,
12+
improving image loading in Roman Research Nexus and similar environments.
13+
- Event data, plots, and posteriors now resolve reliably when paths include spaces or nested folders.
14+
15+
816
## [0.16.4] - 2026-01-14
917

1018
### Added

CITATION.cff

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
cff-version: 1.2.0
22
message: "If you use microlens-submit, please cite it as below."
33
title: "microlens-submit"
4-
version: "0.16.4"
4+
version: "0.16.5"
55
authors:
66
- family-names: Malpas
77
given-names: Amber

RELEASE_NOTES.md

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,12 @@
1-
# microlens-submit v0.16.4 Release Notes
1+
# microlens-submit v0.16.5 Release Notes
22

3-
**Release Date:** 2026-01-14
3+
**Release Date:** 2026-02-04
44

55
## Changelog
66

7-
## [0.16.4] - 2026-01-14
8-
9-
### Added
10-
- Added `remove-event`/`remove-solution` CLI commands and `remove_event`/`remove_solution` API helpers with a `--force` guard for hard deletes.
11-
- Added `git_dir` metadata plus `set-git-dir` to capture Git info when the repo lives outside the submission directory.
12-
- Added optional GPU fields in `hardware_info` (`gpu.model`, `gpu.count`, `gpu.memory_gb`) alongside platform/OS capture.
13-
- Added non-Nexus hardware auto-fill using `psutil` for CPU and memory details.
14-
- Added conda-forge recipe (`conda/recipe/meta.yaml`) to the version bump script (`scripts/bump_version`).
15-
- Added sha256 update in `conda/recipe/meta.yaml` to the release workflow.
16-
- Added a workflow release job to copy the local updated version on the conda-forge recipe to the feedstock fork (`AmberLee2427/microlens-submit-feedstock`) and send a PR, after PyPI release.
17-
18-
19-
### Changed
20-
- Updated tiers to `beginner`/`experienced`; event ID validation now uses inclusive ranges and 3-digit IDs for `2018-test`.
21-
- CLI numeric parsing now accepts leading decimals like `.001`.
22-
- Clarified quickstart/tutorial guidance around working directories and hardware info requirements.
23-
7+
## [0.16.5] - 2026-02-04
248

259
### Fixed
26-
- CSV import now skips blank rows to avoid NoneType parsing errors.
27-
- Validation messaging now highlights missing bands when flux parameters are provided.
28-
- Improved Windows notes editor fallback for better default editor selection.
10+
- Dossier assets are now copied into the dossier output and linked with URL-safe relative paths,
11+
improving image loading in Roman Research Nexus and similar environments.
12+
- Event data, plots, and posteriors now resolve reliably when paths include spaces or nested folders.

TODO

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@
1919
- [x] auto populate hardware info
2020
- [x] ".001" gets interpreted as a string
2121
- [x] nexus init gives hardware warning and it doesn't need to
22-
- [ ] nexus dosiers (with submission in /teams/*) not displaying images (problem in AAS workshop notebook)
22+
- [ ] nexus dosiers (with submission in /teams/*) not displaying images (problem in AAS workshop notebooks)
2323
- [x] "Experienced' tier not "Advanced"
24-
- [ ] validate physical parameters
24+
- [ ] validate physical parameters (blocked)
2525
- [x] "piEN (instead of piEN)" when piEN was missing
26-
- [ ] additional model types
26+
- [ ] additional model types (blocked)
2727
- [x] git and submission in different locations (add git_dir)
2828
- [x] Windows build in workflow
2929
- [x] Release Workflow

conda/recipe/meta.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{% set name = "microlens-submit" %}
22
{% set filename_name = name | replace("-", "_") %}
3-
{% set version = "0.16.4" %}
3+
{% set version = "0.16.5" %}
44
{% set python_min = "3.10" %}
55

66
# NOTE: This recipe is the source of truth for conda-forge. Edit it here in

docs/conf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
author = "RGES-PIT"
99

1010
# The full version, including alpha/beta/rc tags
11-
release = "0.16.4"
11+
release = "0.16.5"
1212

1313
extensions = [
1414
"sphinx.ext.autodoc",

microlens_submit/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
the command line interface.
66
"""
77

8-
__version__ = "0.16.4"
8+
__version__ = "0.16.5"
99

1010
from .models import Event, Solution, Submission
1111
from .utils import load

microlens_submit/dossier/event_page.py

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from .. import __version__
1313
from ..models import Event, Submission
1414
from .solution_page import generate_solution_page
15+
from .utils import resolve_dossier_asset_path
1516

1617

1718
def generate_event_page(event: Event, submission: Submission, output_dir: Path) -> None:
@@ -50,7 +51,17 @@ def generate_event_page(event: Event, submission: Submission, output_dir: Path)
5051
to individual solution pages.
5152
"""
5253
# Prepare output directory (already created)
53-
html = _generate_event_page_content(event, submission)
54+
project_root = Path(submission.project_path)
55+
event_data_link = ""
56+
if hasattr(event, "event_data_path") and event.event_data_path:
57+
event_data_link = resolve_dossier_asset_path(
58+
event.event_data_path,
59+
project_root,
60+
output_dir,
61+
subdir="event-data",
62+
prefix=f"{event.event_id}_event_data",
63+
)
64+
html = _generate_event_page_content(event, submission, event_data_link=event_data_link)
5465
with (output_dir / f"{event.event_id}.html").open("w", encoding="utf-8") as f:
5566
f.write(html)
5667

@@ -59,7 +70,12 @@ def generate_event_page(event: Event, submission: Submission, output_dir: Path)
5970
generate_solution_page(sol, event, submission, output_dir)
6071

6172

62-
def _generate_event_page_content(event: Event, submission: Submission) -> str:
73+
def _generate_event_page_content(
74+
event: Event,
75+
submission: Submission,
76+
*,
77+
event_data_link: str = "",
78+
) -> str:
6379
"""Generate the HTML content for an event dossier page.
6480
6581
Creates the complete HTML content for a single event page, including
@@ -163,10 +179,10 @@ def sort_key(sol):
163179
)
164180
# Optional raw data link
165181
raw_data_html = ""
166-
if hasattr(event, "event_data_path") and event.event_data_path:
182+
if event_data_link:
167183
raw_data_html = (
168184
f'<p class="text-rtd-text">Raw Event Data: '
169-
f'<a href="{event.event_data_path}" '
185+
f'<a href="{event_data_link}" '
170186
f'class="text-rtd-accent hover:underline">Download Data</a></p>'
171187
)
172188
# HTML content

microlens_submit/dossier/full_report.py

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from .dashboard import _generate_dashboard_content
1616
from .event_page import _generate_event_page_content
1717
from .solution_page import _generate_solution_page_content
18+
from .utils import resolve_dossier_asset_path
1819

1920

2021
def generate_full_dossier_report_html(submission: Submission, output_dir: Path) -> None:
@@ -63,19 +64,57 @@ def generate_full_dossier_report_html(submission: Submission, output_dir: Path)
6364
all_html_sections.append('<hr class="my-8 border-t-2 border-rtd-accent">') # Divider after dashboard
6465

6566
# Events and solutions
67+
project_root = Path(submission.project_path)
6668
for event in submission.events.values():
67-
event_html = _generate_event_page_content(event, submission)
69+
event_data_link = ""
70+
if hasattr(event, "event_data_path") and event.event_data_path:
71+
event_data_link = resolve_dossier_asset_path(
72+
event.event_data_path,
73+
project_root,
74+
output_dir,
75+
subdir="event-data",
76+
prefix=f"{event.event_id}_event_data",
77+
)
78+
event_html = _generate_event_page_content(event, submission, event_data_link=event_data_link)
6879
event_body = extract_main_content_body(event_html, section_type="event", section_id=event.event_id)
6980
all_html_sections.append(event_body)
7081
all_html_sections.append('<hr class="my-8 border-t-2 border-rtd-accent">') # Divider after event
7182

7283
for sol in event.get_active_solutions():
73-
sol_html = _generate_solution_page_content(sol, event, submission)
84+
lc_plot = resolve_dossier_asset_path(
85+
sol.lightcurve_plot_path,
86+
project_root,
87+
output_dir,
88+
subdir="plots",
89+
prefix=f"{event.event_id}_{sol.solution_id}_lightcurve",
90+
)
91+
lens_plot = resolve_dossier_asset_path(
92+
sol.lens_plane_plot_path,
93+
project_root,
94+
output_dir,
95+
subdir="plots",
96+
prefix=f"{event.event_id}_{sol.solution_id}_lens",
97+
)
98+
posterior = resolve_dossier_asset_path(
99+
sol.posterior_path,
100+
project_root,
101+
output_dir,
102+
subdir="posteriors",
103+
prefix=f"{event.event_id}_{sol.solution_id}_posterior",
104+
)
105+
sol_html = _generate_solution_page_content(
106+
sol,
107+
event,
108+
submission,
109+
lc_plot=lc_plot,
110+
lens_plot=lens_plot,
111+
posterior=posterior,
112+
)
74113
sol_body = extract_main_content_body(
75114
sol_html,
76115
section_type="solution",
77116
section_id=sol.solution_id,
78-
project_root=Path(submission.project_path),
117+
project_root=project_root,
79118
solution=sol,
80119
)
81120
all_html_sections.append(sol_body)

microlens_submit/dossier/solution_page.py

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@
88

99
from datetime import datetime
1010
from pathlib import Path
11+
from typing import Optional
1112

1213
import markdown
1314

1415
from .. import __version__
1516
from ..models.event import Event
1617
from ..models.solution import Solution
1718
from ..models.submission import Submission
19+
from .utils import resolve_dossier_asset_path
1820

1921

2022
def generate_solution_page(solution: Solution, event: Event, submission: Submission, output_dir: Path) -> None:
@@ -55,12 +57,49 @@ def generate_solution_page(solution: Solution, event: Event, submission: Submiss
5557
Notes are rendered with syntax highlighting for code blocks.
5658
"""
5759
# Prepare output directory (already created)
58-
html = _generate_solution_page_content(solution, event, submission)
60+
project_root = Path(submission.project_path)
61+
lc_plot = resolve_dossier_asset_path(
62+
solution.lightcurve_plot_path,
63+
project_root,
64+
output_dir,
65+
subdir="plots",
66+
prefix=f"{event.event_id}_{solution.solution_id}_lightcurve",
67+
)
68+
lens_plot = resolve_dossier_asset_path(
69+
solution.lens_plane_plot_path,
70+
project_root,
71+
output_dir,
72+
subdir="plots",
73+
prefix=f"{event.event_id}_{solution.solution_id}_lens",
74+
)
75+
posterior = resolve_dossier_asset_path(
76+
solution.posterior_path,
77+
project_root,
78+
output_dir,
79+
subdir="posteriors",
80+
prefix=f"{event.event_id}_{solution.solution_id}_posterior",
81+
)
82+
html = _generate_solution_page_content(
83+
solution,
84+
event,
85+
submission,
86+
lc_plot=lc_plot,
87+
lens_plot=lens_plot,
88+
posterior=posterior,
89+
)
5990
with (output_dir / f"{solution.solution_id}.html").open("w", encoding="utf-8") as f:
6091
f.write(html)
6192

6293

63-
def _generate_solution_page_content(solution: Solution, event: Event, submission: Submission) -> str:
94+
def _generate_solution_page_content(
95+
solution: Solution,
96+
event: Event,
97+
submission: Submission,
98+
*,
99+
lc_plot: Optional[str] = None,
100+
lens_plot: Optional[str] = None,
101+
posterior: Optional[str] = None,
102+
) -> str:
64103
"""Generate the HTML content for a solution dossier page.
65104
66105
Creates the complete HTML content for a single solution page, including
@@ -138,9 +177,9 @@ def _generate_solution_page_content(solution: Solution, event: Event, submission
138177
# Higher-order effects
139178
hoe_str = ", ".join(solution.higher_order_effects) if solution.higher_order_effects else "None"
140179
# Plot paths (relative to solution page)
141-
lc_plot = solution.lightcurve_plot_path or ""
142-
lens_plot = solution.lens_plane_plot_path or ""
143-
posterior = solution.posterior_path or ""
180+
lc_plot = lc_plot if lc_plot is not None else (solution.lightcurve_plot_path or "")
181+
lens_plot = lens_plot if lens_plot is not None else (solution.lens_plane_plot_path or "")
182+
posterior = posterior if posterior is not None else (solution.posterior_path or "")
144183
# Physical parameters table
145184
phys_rows = []
146185
phys = solution.physical_parameters or {}

0 commit comments

Comments
 (0)