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.
Files changed (58) hide show
  1. {yippy-2.7.2 → yippy-2.7.3}/.pre-commit-config.yaml +1 -1
  2. {yippy-2.7.2 → yippy-2.7.3}/CHANGELOG.md +7 -0
  3. {yippy-2.7.2 → yippy-2.7.3}/PKG-INFO +10 -9
  4. {yippy-2.7.2 → yippy-2.7.3}/README.md +9 -8
  5. {yippy-2.7.2 → yippy-2.7.3}/docs/datasets.md +13 -16
  6. {yippy-2.7.2 → yippy-2.7.3}/src/yippy/_version.py +2 -2
  7. {yippy-2.7.2 → yippy-2.7.3}/src/yippy/datasets.py +24 -80
  8. {yippy-2.7.2 → yippy-2.7.3}/tests/conftest.py +3 -3
  9. {yippy-2.7.2 → yippy-2.7.3}/tests/test_build_zenodo_archives.py +9 -9
  10. {yippy-2.7.2 → yippy-2.7.3}/tests/test_datasets.py +26 -25
  11. {yippy-2.7.2 → yippy-2.7.3}/.github/dependabot.yml +0 -0
  12. {yippy-2.7.2 → yippy-2.7.3}/.github/workflows/publish-to-pypi.yml +0 -0
  13. {yippy-2.7.2 → yippy-2.7.3}/.github/workflows/release-please.yml +0 -0
  14. {yippy-2.7.2 → yippy-2.7.3}/.github/workflows/tests.yml +0 -0
  15. {yippy-2.7.2 → yippy-2.7.3}/.gitignore +0 -0
  16. {yippy-2.7.2 → yippy-2.7.3}/.readthedocs.yaml +0 -0
  17. {yippy-2.7.2 → yippy-2.7.3}/.zenodo.json +0 -0
  18. {yippy-2.7.2 → yippy-2.7.3}/LICENSE +0 -0
  19. {yippy-2.7.2 → yippy-2.7.3}/docs/Makefile +0 -0
  20. {yippy-2.7.2 → yippy-2.7.3}/docs/_static/favicon.ico +0 -0
  21. {yippy-2.7.2 → yippy-2.7.3}/docs/azimuthal_averaging.md +0 -0
  22. {yippy-2.7.2 → yippy-2.7.3}/docs/benchmarking.md +0 -0
  23. {yippy-2.7.2 → yippy-2.7.3}/docs/conf.py +0 -0
  24. {yippy-2.7.2 → yippy-2.7.3}/docs/develop/_changelog.md +0 -0
  25. {yippy-2.7.2 → yippy-2.7.3}/docs/examples/00_Performance_Metrics_Overview.ipynb +0 -0
  26. {yippy-2.7.2 → yippy-2.7.3}/docs/examples/01_Core_Throughput.ipynb +0 -0
  27. {yippy-2.7.2 → yippy-2.7.3}/docs/examples/02_Stellar_Leakage_and_Contrast.ipynb +0 -0
  28. {yippy-2.7.2 → yippy-2.7.3}/docs/examples/03_Spatial_Metrics_and_Backgrounds.ipynb +0 -0
  29. {yippy-2.7.2 → yippy-2.7.3}/docs/examples/04_Noise_Floors_and_Integration_Time.ipynb +0 -0
  30. {yippy-2.7.2 → yippy-2.7.3}/docs/examples/05_Aperture_Methods_Comparison.ipynb +0 -0
  31. {yippy-2.7.2 → yippy-2.7.3}/docs/examples/06_Noise_Floor_Conventions.ipynb +0 -0
  32. {yippy-2.7.2 → yippy-2.7.3}/docs/examples/Basics.ipynb +0 -0
  33. {yippy-2.7.2 → yippy-2.7.3}/docs/examples/FourierInterpolation.ipynb +0 -0
  34. {yippy-2.7.2 → yippy-2.7.3}/docs/examples/QuarterSymmetric.ipynb +0 -0
  35. {yippy-2.7.2 → yippy-2.7.3}/docs/examples/RadiallySymmetric.ipynb +0 -0
  36. {yippy-2.7.2 → yippy-2.7.3}/docs/examples/SkyTrans.ipynb +0 -0
  37. {yippy-2.7.2 → yippy-2.7.3}/docs/examples/StellarIntens.ipynb +0 -0
  38. {yippy-2.7.2 → yippy-2.7.3}/docs/index.md +0 -0
  39. {yippy-2.7.2 → yippy-2.7.3}/docs/make.bat +0 -0
  40. {yippy-2.7.2 → yippy-2.7.3}/pyproject.toml +0 -0
  41. {yippy-2.7.2 → yippy-2.7.3}/scripts/build_zenodo_archives.py +0 -0
  42. {yippy-2.7.2 → yippy-2.7.3}/src/yippy/__init__.py +0 -0
  43. {yippy-2.7.2 → yippy-2.7.3}/src/yippy/coronagraph.py +0 -0
  44. {yippy-2.7.2 → yippy-2.7.3}/src/yippy/eqx_coronagraph.py +0 -0
  45. {yippy-2.7.2 → yippy-2.7.3}/src/yippy/export.py +0 -0
  46. {yippy-2.7.2 → yippy-2.7.3}/src/yippy/header.py +0 -0
  47. {yippy-2.7.2 → yippy-2.7.3}/src/yippy/jax_funcs.py +0 -0
  48. {yippy-2.7.2 → yippy-2.7.3}/src/yippy/logger.py +0 -0
  49. {yippy-2.7.2 → yippy-2.7.3}/src/yippy/offax.py +0 -0
  50. {yippy-2.7.2 → yippy-2.7.3}/src/yippy/offjax.py +0 -0
  51. {yippy-2.7.2 → yippy-2.7.3}/src/yippy/performance.py +0 -0
  52. {yippy-2.7.2 → yippy-2.7.3}/src/yippy/sky_trans.py +0 -0
  53. {yippy-2.7.2 → yippy-2.7.3}/src/yippy/stellar_intens.py +0 -0
  54. {yippy-2.7.2 → yippy-2.7.3}/src/yippy/util.py +0 -0
  55. {yippy-2.7.2 → yippy-2.7.3}/tests/test_eqx_coronagraph.py +0 -0
  56. {yippy-2.7.2 → yippy-2.7.3}/tests/test_fft_interpolation.py +0 -0
  57. {yippy-2.7.2 → yippy-2.7.3}/tests/test_map_methods.py +0 -0
  58. {yippy-2.7.2 → yippy-2.7.3}/tests/test_performance.py +0 -0
@@ -7,7 +7,7 @@ repos:
7
7
  args: [--pytest-test-first]
8
8
  - id: end-of-file-fixer
9
9
  - repo: https://github.com/astral-sh/ruff-pre-commit
10
- rev: v0.15.12
10
+ rev: v0.15.13
11
11
  hooks:
12
12
  - id: ruff-check
13
13
  args: [--fix]
@@ -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.2
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 (beta)
211
+ ## Example data
212
212
 
213
- For convenience, yippy can download a small catalog of example YIPs hosted
214
- on Zenodo. This is useful for tutorials, CI, and "I just want to try it"
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
- > **Beta.** The Zenodo-hosted YIP archive is a stopgap. A non-Zenodo
225
- > distribution channel may replace it in the near future. For production
226
- > or reproducible work, manage your own YIP paths and pass them to
227
- > `Coronagraph(path)` directly.
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 (beta)
153
+ ## Example data
154
154
 
155
- For convenience, yippy can download a small catalog of example YIPs hosted
156
- on Zenodo. This is useful for tutorials, CI, and "I just want to try it"
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
- > **Beta.** The Zenodo-hosted YIP archive is a stopgap. A non-Zenodo
167
- > distribution channel may replace it in the near future. For production
168
- > or reproducible work, manage your own YIP paths and pass them to
169
- > `Coronagraph(path)` directly.
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 currently hosted on Zenodo and cached locally on first
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 Zenodo-hosted catalog is **beta**. A non-Zenodo distribution channel
20
- may replace it in the near future. For reproducible or production work,
21
- manage your own YIP paths and pass them to `Coronagraph(path)` directly.
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 once their archive is on Zenodo
29
- and the md5 hash is locked into the catalog.
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
- ['eac1_aavc_1d',
159
- 'eac1_spc_1d',
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.2'
22
- __version_tuple__ = version_tuple = (2, 7, 2)
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 Zenodo and fetched via pooch's DOI protocol. To
10
- publish new YIPs: upload a new Zenodo record version, paste the new DOI
11
- into ``ZENODO_DOI``, and refresh the md5 hashes via
12
- ``scripts/build_zenodo_archives.py``.
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
- # Zenodo DOI for the YIP archive. Updated when a new version of the record
51
- # is published on Zenodo.
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
- ZENODO_DOI: str = "10.5281/zenodo.20146086"
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
- # EAC1 (1D)
61
- "eac1_aavc_1d": {
74
+ "eac1_aavc_2d": {
62
75
  "telescope": "eac1",
63
76
  "coronagraph": "aavc",
64
77
  "designer": "Susan Redmond",
65
- "md5": "md5:5cb5fe8bd29c8f4d2abf47b259535061",
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=f"doi:{ZENODO_DOI}/",
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, ZENODO_DOI
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 ZENODO_DOI.endswith("PLACEHOLDER"),
10
- reason="YIP not yet fetchable: md5 unset or Zenodo DOI is placeholder.",
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
- "eac1_aavc_1d": "md5:" + "a" * 32,
136
- "eac1_spc_1d": None, # awaiting fresh build
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["eac1_aavc_1d"]["md5"] == "md5:" + "a" * 32
144
- assert parsed["eac1_aavc_1d"]["designer"] == "Susan Redmond"
145
- assert parsed["eac1_spc_1d"]["md5"] is None
146
- assert parsed["eac1_spc_1d"]["designer"] == "Jessica Gersh-Range"
147
- # Must include all 13 catalog entries (12 1D + 1 2D) even when only
148
- # some are updated.
149
- assert len(parsed) == 13
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 test_catalog_has_13_entries():
19
- """Catalog must contain exactly 13 entries (12 1D + 1 2D)."""
20
- assert len(datasets.CATALOG) == 13
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 len(names) == 6 # 5 1D + 1 2D for eac1
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 returns matches across telescopes and samplings."""
71
- names = datasets.list_yips(coronagraph="aavc")
72
- assert sorted(names) == ["eac1_aavc_1d", "eac1_aavc_2d"]
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 len(datasets.list_yips(sampling="1d")) == 12
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("eac1_aavc_1d")
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("eac1_aavc_1d", telescope="eac1")
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
- # eac1 + aavc matches both _1d and _2d; sampling must also be passed.
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", coronagraph="aavc")
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.ZENODO_DOI.endswith("PLACEHOLDER"),
257
- reason="Zenodo DOI not yet set; v1 release pending.",
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