yippy 2.7.2__tar.gz → 2.7.3__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.
- {yippy-2.7.2 → yippy-2.7.3}/.pre-commit-config.yaml +1 -1
- {yippy-2.7.2 → yippy-2.7.3}/CHANGELOG.md +7 -0
- {yippy-2.7.2 → yippy-2.7.3}/PKG-INFO +10 -9
- {yippy-2.7.2 → yippy-2.7.3}/README.md +9 -8
- {yippy-2.7.2 → yippy-2.7.3}/docs/datasets.md +13 -16
- {yippy-2.7.2 → yippy-2.7.3}/src/yippy/_version.py +2 -2
- {yippy-2.7.2 → yippy-2.7.3}/src/yippy/datasets.py +24 -80
- {yippy-2.7.2 → yippy-2.7.3}/tests/conftest.py +3 -3
- {yippy-2.7.2 → yippy-2.7.3}/tests/test_build_zenodo_archives.py +9 -9
- {yippy-2.7.2 → yippy-2.7.3}/tests/test_datasets.py +26 -25
- {yippy-2.7.2 → yippy-2.7.3}/.github/dependabot.yml +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/.github/workflows/publish-to-pypi.yml +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/.github/workflows/release-please.yml +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/.github/workflows/tests.yml +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/.gitignore +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/.readthedocs.yaml +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/.zenodo.json +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/LICENSE +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/docs/Makefile +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/docs/_static/favicon.ico +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/docs/azimuthal_averaging.md +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/docs/benchmarking.md +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/docs/conf.py +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/docs/develop/_changelog.md +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/docs/examples/00_Performance_Metrics_Overview.ipynb +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/docs/examples/01_Core_Throughput.ipynb +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/docs/examples/02_Stellar_Leakage_and_Contrast.ipynb +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/docs/examples/03_Spatial_Metrics_and_Backgrounds.ipynb +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/docs/examples/04_Noise_Floors_and_Integration_Time.ipynb +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/docs/examples/05_Aperture_Methods_Comparison.ipynb +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/docs/examples/06_Noise_Floor_Conventions.ipynb +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/docs/examples/Basics.ipynb +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/docs/examples/FourierInterpolation.ipynb +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/docs/examples/QuarterSymmetric.ipynb +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/docs/examples/RadiallySymmetric.ipynb +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/docs/examples/SkyTrans.ipynb +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/docs/examples/StellarIntens.ipynb +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/docs/index.md +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/docs/make.bat +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/pyproject.toml +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/scripts/build_zenodo_archives.py +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/src/yippy/__init__.py +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/src/yippy/coronagraph.py +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/src/yippy/eqx_coronagraph.py +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/src/yippy/export.py +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/src/yippy/header.py +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/src/yippy/jax_funcs.py +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/src/yippy/logger.py +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/src/yippy/offax.py +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/src/yippy/offjax.py +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/src/yippy/performance.py +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/src/yippy/sky_trans.py +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/src/yippy/stellar_intens.py +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/src/yippy/util.py +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/tests/test_eqx_coronagraph.py +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/tests/test_fft_interpolation.py +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/tests/test_map_methods.py +0 -0
- {yippy-2.7.2 → yippy-2.7.3}/tests/test_performance.py +0 -0
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.7.3](https://github.com/CoreySpohn/yippy/compare/v2.7.2...v2.7.3) (2026-05-18)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* Move YIP hosting from Zenodo to a data release ([d811a5e](https://github.com/CoreySpohn/yippy/commit/d811a5ef6381ed9c2bfdd0585c24cae1f8e7a23e))
|
|
9
|
+
|
|
3
10
|
## [2.7.2](https://github.com/CoreySpohn/yippy/compare/v2.7.1...v2.7.2) (2026-05-15)
|
|
4
11
|
|
|
5
12
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: yippy
|
|
3
|
-
Version: 2.7.
|
|
3
|
+
Version: 2.7.3
|
|
4
4
|
Summary: A Python and JAX wrapper to create a coronagraph object from a yield input package
|
|
5
5
|
Project-URL: Homepage, https://github.com/CoreySpohn/yippy
|
|
6
6
|
Project-URL: Issues, https://github.com/CoreySpohn/yippy/issues
|
|
@@ -208,11 +208,11 @@ throughput and core area are computed using an adaptive aperture that includes
|
|
|
208
208
|
all oversampled pixels exceeding `ratio * peak`. This matches AYO's
|
|
209
209
|
`photap_frac` / `omega_lod` calculation and is recommended for ETC integration.
|
|
210
210
|
|
|
211
|
-
## Example data
|
|
211
|
+
## Example data
|
|
212
212
|
|
|
213
|
-
|
|
214
|
-
on
|
|
215
|
-
exploration:
|
|
213
|
+
Two reference YIPs ship as GitHub release assets on this repo and can be
|
|
214
|
+
fetched on demand. This is useful for tutorials, CI, and "I just want to
|
|
215
|
+
try it" exploration:
|
|
216
216
|
|
|
217
217
|
```python
|
|
218
218
|
from yippy import Coronagraph, fetch_yip
|
|
@@ -221,10 +221,11 @@ yip_path = fetch_yip("eac1_aavc_2d") # download (cached after first call)
|
|
|
221
221
|
coro = Coronagraph(yip_path)
|
|
222
222
|
```
|
|
223
223
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
224
|
+
The catalog is currently minimal. Long-term YIP hosting will be provided by
|
|
225
|
+
ExEP, and only the two reference YIPs used by the yippy paper validation
|
|
226
|
+
pipeline and pyEDITH (`eac1_aavc_2d` and `eac1_optimal_order_6_1d`) are shipped here. For
|
|
227
|
+
production work or YIPs outside this set, manage your own YIP paths and pass
|
|
228
|
+
them to `Coronagraph(path)` directly.
|
|
228
229
|
|
|
229
230
|
See [`yippy.list_yips()`](https://yippy.readthedocs.io/en/latest/datasets.html)
|
|
230
231
|
for the available names and the
|
|
@@ -150,11 +150,11 @@ throughput and core area are computed using an adaptive aperture that includes
|
|
|
150
150
|
all oversampled pixels exceeding `ratio * peak`. This matches AYO's
|
|
151
151
|
`photap_frac` / `omega_lod` calculation and is recommended for ETC integration.
|
|
152
152
|
|
|
153
|
-
## Example data
|
|
153
|
+
## Example data
|
|
154
154
|
|
|
155
|
-
|
|
156
|
-
on
|
|
157
|
-
exploration:
|
|
155
|
+
Two reference YIPs ship as GitHub release assets on this repo and can be
|
|
156
|
+
fetched on demand. This is useful for tutorials, CI, and "I just want to
|
|
157
|
+
try it" exploration:
|
|
158
158
|
|
|
159
159
|
```python
|
|
160
160
|
from yippy import Coronagraph, fetch_yip
|
|
@@ -163,10 +163,11 @@ yip_path = fetch_yip("eac1_aavc_2d") # download (cached after first call)
|
|
|
163
163
|
coro = Coronagraph(yip_path)
|
|
164
164
|
```
|
|
165
165
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
166
|
+
The catalog is currently minimal. Long-term YIP hosting will be provided by
|
|
167
|
+
ExEP, and only the two reference YIPs used by the yippy paper validation
|
|
168
|
+
pipeline and pyEDITH (`eac1_aavc_2d` and `eac1_optimal_order_6_1d`) are shipped here. For
|
|
169
|
+
production work or YIPs outside this set, manage your own YIP paths and pass
|
|
170
|
+
them to `Coronagraph(path)` directly.
|
|
170
171
|
|
|
171
172
|
See [`yippy.list_yips()`](https://yippy.readthedocs.io/en/latest/datasets.html)
|
|
172
173
|
for the available names and the
|
|
@@ -12,21 +12,24 @@ coro = Coronagraph("path/to/eac1_aavc_2d")
|
|
|
12
12
|
|
|
13
13
|
For convenience, yippy also ships a small curated catalog of YIPs that
|
|
14
14
|
can be downloaded on demand via [pooch](https://www.fatiando.org/pooch/).
|
|
15
|
-
The catalog is
|
|
16
|
-
use.
|
|
15
|
+
The catalog is hosted as assets on a tagged GitHub release of the yippy
|
|
16
|
+
repository and cached locally on first use.
|
|
17
17
|
|
|
18
18
|
```{note}
|
|
19
|
-
The
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
The catalog is intentionally minimal. Long-term YIP hosting is ExEP's
|
|
20
|
+
responsibility, and only the two reference YIPs used by the yippy paper
|
|
21
|
+
validation pipeline are shipped here. For production work or YIPs
|
|
22
|
+
outside this set, manage your own YIP paths and pass them to
|
|
23
|
+
`Coronagraph(path)` directly.
|
|
22
24
|
```
|
|
23
25
|
|
|
24
26
|
## Available datasets
|
|
25
27
|
|
|
26
28
|
The table below is generated from `yippy.datasets.CATALOG` at doc-build
|
|
27
29
|
time and lists every YIP yippy knows about. Every entry in the catalog
|
|
28
|
-
is fetchable; new YIPs are added only
|
|
29
|
-
and the md5 hash is
|
|
30
|
+
is fetchable; new YIPs are added only when the underlying release is
|
|
31
|
+
bumped (see `DATA_RELEASE_TAG` in `yippy.datasets`) and the md5 hash is
|
|
32
|
+
locked into the catalog.
|
|
30
33
|
|
|
31
34
|
```{include} _generated/yip_catalog.md
|
|
32
35
|
```
|
|
@@ -155,17 +158,11 @@ Three small helpers let you browse the catalog without downloading anything.
|
|
|
155
158
|
```python
|
|
156
159
|
>>> from yippy import list_yips
|
|
157
160
|
>>> list_yips(telescope="eac1")
|
|
158
|
-
['
|
|
159
|
-
'
|
|
160
|
-
'eac1_lcppc_v1_1d',
|
|
161
|
-
'eac1_optimal_order_6_1d',
|
|
162
|
-
'eac1_pic_400channels_order6_1d',
|
|
163
|
-
'eac1_aavc_2d']
|
|
161
|
+
['eac1_aavc_2d',
|
|
162
|
+
'eac1_optimal_order_6_1d']
|
|
164
163
|
|
|
165
164
|
>>> list_yips(coronagraph="optimal_order_6")
|
|
166
|
-
['eac1_optimal_order_6_1d'
|
|
167
|
-
'eac2_optimal_order_6_1d',
|
|
168
|
-
'eac3_optimal_order_6_1d']
|
|
165
|
+
['eac1_optimal_order_6_1d']
|
|
169
166
|
|
|
170
167
|
>>> list_yips(sampling="2d")
|
|
171
168
|
['eac1_aavc_2d']
|
|
@@ -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 = '2.7.
|
|
22
|
-
__version_tuple__ = version_tuple = (2, 7,
|
|
21
|
+
__version__ = version = '2.7.3'
|
|
22
|
+
__version_tuple__ = version_tuple = (2, 7, 3)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -6,10 +6,17 @@ and filtered discovery (``telescope``, ``coronagraph``, ``sampling``,
|
|
|
6
6
|
``md5``). Descriptive metadata (designer, wavelengths, dark-zone
|
|
7
7
|
extent, ...) lives in the FITS headers inside each YIP, not here.
|
|
8
8
|
|
|
9
|
-
Archives are hosted on
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
``
|
|
9
|
+
Archives are hosted as assets on a tagged GitHub release of this repo
|
|
10
|
+
(currently ``data-v1``) and fetched via pooch over HTTPS. The release
|
|
11
|
+
tag is separate from the code-release lifecycle managed by
|
|
12
|
+
release-please. To publish new YIPs: bump ``DATA_RELEASE_TAG`` to a new
|
|
13
|
+
``data-vN``, attach the updated zips to that release, and refresh the
|
|
14
|
+
md5 hashes here.
|
|
15
|
+
|
|
16
|
+
The two-YIP catalog is intentionally minimal: long-term YIP hosting will
|
|
17
|
+
be provided by ExEP, and yippy hosts only the two reference YIPs used
|
|
18
|
+
by the yippy paper validation pipeline. When ExEP's catalog comes
|
|
19
|
+
online, the discovery API here grows back into a thin proxy over it.
|
|
13
20
|
|
|
14
21
|
Public API:
|
|
15
22
|
- ``fetch_yip(name=None, *, telescope=None, coronagraph=None, sampling=None,
|
|
@@ -47,34 +54,28 @@ logging.getLogger("pooch").setLevel(logging.WARNING)
|
|
|
47
54
|
CACHE_DIR_ENV_VAR = "YIPPY_CACHE_DIR"
|
|
48
55
|
|
|
49
56
|
# ---------------------------------------------------------------------------
|
|
50
|
-
#
|
|
51
|
-
#
|
|
57
|
+
# Release tag carrying the YIP zip assets on this repo's GitHub releases.
|
|
58
|
+
# Bump to ``data-vN`` when the underlying YIP files change.
|
|
52
59
|
# ---------------------------------------------------------------------------
|
|
53
|
-
|
|
60
|
+
DATA_RELEASE_TAG: str = "data-v1"
|
|
61
|
+
_DATA_BASE_URL: str = (
|
|
62
|
+
f"https://github.com/CoreySpohn/yippy/releases/download/{DATA_RELEASE_TAG}/"
|
|
63
|
+
)
|
|
54
64
|
|
|
55
65
|
|
|
56
66
|
# ---------------------------------------------------------------------------
|
|
57
67
|
# Catalog
|
|
68
|
+
#
|
|
69
|
+
# Intentionally minimal: long-term YIP hosting is ExEP's responsibility.
|
|
70
|
+
# Only the two reference YIPs used by the yippy paper validation pipeline
|
|
71
|
+
# live here.
|
|
58
72
|
# ---------------------------------------------------------------------------
|
|
59
73
|
CATALOG: dict[str, dict[str, Any]] = {
|
|
60
|
-
|
|
61
|
-
"eac1_aavc_1d": {
|
|
74
|
+
"eac1_aavc_2d": {
|
|
62
75
|
"telescope": "eac1",
|
|
63
76
|
"coronagraph": "aavc",
|
|
64
77
|
"designer": "Susan Redmond",
|
|
65
|
-
"md5": "md5:
|
|
66
|
-
},
|
|
67
|
-
"eac1_spc_1d": {
|
|
68
|
-
"telescope": "eac1",
|
|
69
|
-
"coronagraph": "spc",
|
|
70
|
-
"designer": "Jessica Gersh-Range",
|
|
71
|
-
"md5": "md5:1b70ddebb8b89226b206c6d08817542d",
|
|
72
|
-
},
|
|
73
|
-
"eac1_lcppc_v1_1d": {
|
|
74
|
-
"telescope": "eac1",
|
|
75
|
-
"coronagraph": "lcppc_v1",
|
|
76
|
-
"designer": "David Doelman",
|
|
77
|
-
"md5": "md5:189101a21fdffe7e2a013712f34da83b",
|
|
78
|
+
"md5": "md5:1f4892faff18e55cbec9781a055bea4d",
|
|
78
79
|
},
|
|
79
80
|
"eac1_optimal_order_6_1d": {
|
|
80
81
|
"telescope": "eac1",
|
|
@@ -82,63 +83,6 @@ CATALOG: dict[str, dict[str, Any]] = {
|
|
|
82
83
|
"designer": "Rus Belikov",
|
|
83
84
|
"md5": "md5:df52540008a0e85467720ec91c3a84b8",
|
|
84
85
|
},
|
|
85
|
-
"eac1_pic_400channels_order6_1d": {
|
|
86
|
-
"telescope": "eac1",
|
|
87
|
-
"coronagraph": "pic_400channels_order6",
|
|
88
|
-
"designer": "Dan Sirbu",
|
|
89
|
-
"md5": "md5:b90c4600fc32edfc6007c7fff2642036",
|
|
90
|
-
},
|
|
91
|
-
# EAC2 (1D)
|
|
92
|
-
"eac2_lcppc_v1_1d": {
|
|
93
|
-
"telescope": "eac2",
|
|
94
|
-
"coronagraph": "lcppc_v1",
|
|
95
|
-
"designer": "David Doelman",
|
|
96
|
-
"md5": "md5:80cfbad3f63eb7c49b467342d19e32cc",
|
|
97
|
-
},
|
|
98
|
-
"eac2_optimal_order_6_1d": {
|
|
99
|
-
"telescope": "eac2",
|
|
100
|
-
"coronagraph": "optimal_order_6",
|
|
101
|
-
"designer": "Rus Belikov",
|
|
102
|
-
"md5": "md5:579c80c9e3f7f52a0ebd18858485fa4b",
|
|
103
|
-
},
|
|
104
|
-
"eac2_pic_400channels_order6_1d": {
|
|
105
|
-
"telescope": "eac2",
|
|
106
|
-
"coronagraph": "pic_400channels_order6",
|
|
107
|
-
"designer": "Dan Sirbu",
|
|
108
|
-
"md5": "md5:384c79d3ac1777c0c2680348cb84fcce",
|
|
109
|
-
},
|
|
110
|
-
# EAC3 (1D)
|
|
111
|
-
"eac3_lcppc_v1_1d": {
|
|
112
|
-
"telescope": "eac3",
|
|
113
|
-
"coronagraph": "lcppc_v1",
|
|
114
|
-
"designer": "David Doelman",
|
|
115
|
-
"md5": "md5:dd97beca90e8a1f47c0efe8490d40f27",
|
|
116
|
-
},
|
|
117
|
-
"eac3_optimal_order_6_1d": {
|
|
118
|
-
"telescope": "eac3",
|
|
119
|
-
"coronagraph": "optimal_order_6",
|
|
120
|
-
"designer": "Rus Belikov",
|
|
121
|
-
"md5": "md5:7c7a76d324f5b62ba2f0523534dd8076",
|
|
122
|
-
},
|
|
123
|
-
"eac3_aplc_1d": {
|
|
124
|
-
"telescope": "eac3",
|
|
125
|
-
"coronagraph": "aplc",
|
|
126
|
-
"designer": "Bryony Nickson",
|
|
127
|
-
"md5": "md5:2c880190f36d92d7d4c5785a9ebf994a",
|
|
128
|
-
},
|
|
129
|
-
"eac3_pic_400channels_order6_1d": {
|
|
130
|
-
"telescope": "eac3",
|
|
131
|
-
"coronagraph": "pic_400channels_order6",
|
|
132
|
-
"designer": "Dan Sirbu",
|
|
133
|
-
"md5": "md5:5b530b87c2ee6020118455789ac4328e",
|
|
134
|
-
},
|
|
135
|
-
# EAC1 (2D)
|
|
136
|
-
"eac1_aavc_2d": {
|
|
137
|
-
"telescope": "eac1",
|
|
138
|
-
"coronagraph": "aavc",
|
|
139
|
-
"designer": "Susan Redmond",
|
|
140
|
-
"md5": "md5:1f4892faff18e55cbec9781a055bea4d",
|
|
141
|
-
},
|
|
142
86
|
}
|
|
143
87
|
|
|
144
88
|
|
|
@@ -159,7 +103,7 @@ def _make_pikachu(cache_dir_path: str | Path) -> pooch.Pooch:
|
|
|
159
103
|
"""Build a pooch instance for the YIP catalog at ``cache_dir_path``."""
|
|
160
104
|
return pooch.create(
|
|
161
105
|
path=cache_dir_path,
|
|
162
|
-
base_url=
|
|
106
|
+
base_url=_DATA_BASE_URL,
|
|
163
107
|
registry={f"{name}.zip": meta["md5"] for name, meta in CATALOG.items()},
|
|
164
108
|
)
|
|
165
109
|
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
import pytest
|
|
4
4
|
|
|
5
5
|
from yippy import Coronagraph
|
|
6
|
-
from yippy.datasets import CATALOG,
|
|
6
|
+
from yippy.datasets import CATALOG, DATA_RELEASE_TAG
|
|
7
7
|
|
|
8
8
|
requires_available_yip = pytest.mark.skipif(
|
|
9
|
-
CATALOG["eac1_aavc_2d"]["md5"] is None or
|
|
10
|
-
reason="YIP not yet fetchable: md5 unset or
|
|
9
|
+
CATALOG["eac1_aavc_2d"]["md5"] is None or DATA_RELEASE_TAG.endswith("PLACEHOLDER"),
|
|
10
|
+
reason="YIP not yet fetchable: md5 unset or release tag is placeholder.",
|
|
11
11
|
)
|
|
12
12
|
|
|
13
13
|
|
|
@@ -132,18 +132,18 @@ def test_build_archive_is_deterministic(tmp_path):
|
|
|
132
132
|
def test_emit_catalog_block_is_valid_python(tmp_path):
|
|
133
133
|
"""The printed CATALOG block must be re-parseable as a Python dict."""
|
|
134
134
|
updates = {
|
|
135
|
-
"
|
|
136
|
-
"
|
|
135
|
+
"eac1_aavc_2d": "md5:" + "a" * 32,
|
|
136
|
+
"eac1_optimal_order_6_1d": None, # awaiting fresh build
|
|
137
137
|
}
|
|
138
138
|
block = bza.format_catalog_block(updates)
|
|
139
139
|
# Confirm Python can evaluate it
|
|
140
140
|
ns: dict = {}
|
|
141
141
|
exec(block, ns)
|
|
142
142
|
parsed = ns["CATALOG"]
|
|
143
|
-
assert parsed["
|
|
144
|
-
assert parsed["
|
|
145
|
-
assert parsed["
|
|
146
|
-
assert parsed["
|
|
147
|
-
#
|
|
148
|
-
# some are updated.
|
|
149
|
-
assert len(parsed) ==
|
|
143
|
+
assert parsed["eac1_aavc_2d"]["md5"] == "md5:" + "a" * 32
|
|
144
|
+
assert parsed["eac1_aavc_2d"]["designer"] == "Susan Redmond"
|
|
145
|
+
assert parsed["eac1_optimal_order_6_1d"]["md5"] is None
|
|
146
|
+
assert parsed["eac1_optimal_order_6_1d"]["designer"] == "Rus Belikov"
|
|
147
|
+
# The trimmed minimal catalog ships exactly the two reference YIPs
|
|
148
|
+
# even when only some are updated.
|
|
149
|
+
assert len(parsed) == 2
|
|
@@ -15,9 +15,15 @@ VALID_HASH = re.compile(r"^md5:[0-9a-f]{32}$")
|
|
|
15
15
|
VALID_SAMPLING_SUFFIXES = ("_1d", "_2d")
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
def
|
|
19
|
-
"""Catalog
|
|
20
|
-
|
|
18
|
+
def test_catalog_has_two_reference_entries():
|
|
19
|
+
"""Catalog ships the two reference YIPs used by the yippy paper.
|
|
20
|
+
|
|
21
|
+
Long-term YIP hosting is ExEP's responsibility; yippy hosts only the
|
|
22
|
+
minimum needed to reproduce the validation figures. If the catalog
|
|
23
|
+
grows beyond two reference YIPs, that decision should be reflected
|
|
24
|
+
by updating this expectation deliberately.
|
|
25
|
+
"""
|
|
26
|
+
assert set(datasets.CATALOG) == {"eac1_aavc_2d", "eac1_optimal_order_6_1d"}
|
|
21
27
|
|
|
22
28
|
|
|
23
29
|
def test_catalog_keys_match_telescope_coronagraph_sampling():
|
|
@@ -62,26 +68,21 @@ def test_list_yips_no_filter_returns_all():
|
|
|
62
68
|
def test_list_yips_telescope_filter():
|
|
63
69
|
"""Filtering by telescope returns only matching entries."""
|
|
64
70
|
names = datasets.list_yips(telescope="eac1")
|
|
65
|
-
assert
|
|
66
|
-
assert all(n.startswith("eac1_") for n in names)
|
|
71
|
+
assert sorted(names) == ["eac1_aavc_2d", "eac1_optimal_order_6_1d"]
|
|
67
72
|
|
|
68
73
|
|
|
69
74
|
def test_list_yips_coronagraph_filter():
|
|
70
|
-
"""Filtering by coronagraph
|
|
71
|
-
|
|
72
|
-
assert
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
def test_list_yips_combined_filter():
|
|
76
|
-
"""Combining telescope and coronagraph filters narrows when sampling is unique."""
|
|
77
|
-
names = datasets.list_yips(telescope="eac3", coronagraph="aplc")
|
|
78
|
-
assert names == ["eac3_aplc_1d"]
|
|
75
|
+
"""Filtering by coronagraph isolates one entry in the minimal catalog."""
|
|
76
|
+
assert datasets.list_yips(coronagraph="aavc") == ["eac1_aavc_2d"]
|
|
77
|
+
assert datasets.list_yips(coronagraph="optimal_order_6") == [
|
|
78
|
+
"eac1_optimal_order_6_1d"
|
|
79
|
+
]
|
|
79
80
|
|
|
80
81
|
|
|
81
82
|
def test_list_yips_sampling_filter():
|
|
82
83
|
"""Filtering by sampling returns all entries of that regime."""
|
|
83
84
|
assert datasets.list_yips(sampling="2d") == ["eac1_aavc_2d"]
|
|
84
|
-
assert
|
|
85
|
+
assert datasets.list_yips(sampling="1d") == ["eac1_optimal_order_6_1d"]
|
|
85
86
|
|
|
86
87
|
|
|
87
88
|
def test_list_yips_three_axis_filter_unique():
|
|
@@ -89,9 +90,6 @@ def test_list_yips_three_axis_filter_unique():
|
|
|
89
90
|
assert datasets.list_yips(telescope="eac1", coronagraph="aavc", sampling="2d") == [
|
|
90
91
|
"eac1_aavc_2d"
|
|
91
92
|
]
|
|
92
|
-
assert datasets.list_yips(telescope="eac1", coronagraph="aavc", sampling="1d") == [
|
|
93
|
-
"eac1_aavc_1d"
|
|
94
|
-
]
|
|
95
93
|
|
|
96
94
|
|
|
97
95
|
def test_list_yips_unknown_kwarg_raises_typeerror():
|
|
@@ -117,7 +115,7 @@ def test_yip_exists_unknown_name():
|
|
|
117
115
|
|
|
118
116
|
def test_yip_info_returns_metadata_dict():
|
|
119
117
|
"""yip_info() returns the catalog metadata dict for a known entry."""
|
|
120
|
-
info = datasets.yip_info("
|
|
118
|
+
info = datasets.yip_info("eac1_aavc_2d")
|
|
121
119
|
assert info["telescope"] == "eac1"
|
|
122
120
|
assert info["coronagraph"] == "aavc"
|
|
123
121
|
assert "md5" in info
|
|
@@ -132,7 +130,7 @@ def test_yip_info_unknown_raises_keyerror():
|
|
|
132
130
|
def test_fetch_yip_both_name_and_kwargs_raises():
|
|
133
131
|
"""Passing both a name and filter kwargs raises TypeError."""
|
|
134
132
|
with pytest.raises(TypeError, match="either"):
|
|
135
|
-
datasets.fetch_yip("
|
|
133
|
+
datasets.fetch_yip("eac1_aavc_2d", telescope="eac1")
|
|
136
134
|
|
|
137
135
|
|
|
138
136
|
def test_fetch_yip_neither_name_nor_kwargs_raises():
|
|
@@ -156,10 +154,13 @@ def test_fetch_yip_zero_match_query_raises_valueerror():
|
|
|
156
154
|
|
|
157
155
|
|
|
158
156
|
def test_fetch_yip_multi_match_query_raises_valueerror():
|
|
159
|
-
"""A structured query that matches multiple entries raises ValueError.
|
|
160
|
-
|
|
157
|
+
"""A structured query that matches multiple entries raises ValueError.
|
|
158
|
+
|
|
159
|
+
With the minimal two-YIP catalog, ``telescope='eac1'`` matches both
|
|
160
|
+
entries because they share that prefix.
|
|
161
|
+
"""
|
|
161
162
|
with pytest.raises(ValueError, match="multiple"):
|
|
162
|
-
datasets.fetch_yip(telescope="eac1"
|
|
163
|
+
datasets.fetch_yip(telescope="eac1")
|
|
163
164
|
|
|
164
165
|
|
|
165
166
|
def test_cache_dir_returns_platform_default_when_env_unset(monkeypatch):
|
|
@@ -253,8 +254,8 @@ def test_fetch_yip_cache_path_builds_separate_pooch(monkeypatch, tmp_path):
|
|
|
253
254
|
|
|
254
255
|
@pytest.mark.network
|
|
255
256
|
@pytest.mark.skipif(
|
|
256
|
-
datasets.
|
|
257
|
-
reason="
|
|
257
|
+
datasets.DATA_RELEASE_TAG.endswith("PLACEHOLDER"),
|
|
258
|
+
reason="Release tag not yet set; data-vN release pending.",
|
|
258
259
|
)
|
|
259
260
|
def test_fetch_smallest_yip_loads_as_coronagraph(tmp_path):
|
|
260
261
|
"""End-to-end: pull the smallest available YIP and load yippy.Coronagraph."""
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|