sxs 2024.0.28__tar.gz → 2024.0.30__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 (131) hide show
  1. {sxs-2024.0.28 → sxs-2024.0.30}/.github/workflows/build.yml +7 -29
  2. {sxs-2024.0.28 → sxs-2024.0.30}/CITATION.cff +2 -2
  3. {sxs-2024.0.28 → sxs-2024.0.30}/PKG-INFO +1 -1
  4. sxs-2024.0.30/sxs/__version__.py +1 -0
  5. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/metadata/metadata.py +22 -9
  6. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/simulations/simulation.py +7 -1
  7. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/simulations/simulations.py +25 -3
  8. sxs-2024.0.30/tests/test_simulation.py +67 -0
  9. sxs-2024.0.28/sxs/__version__.py +0 -1
  10. sxs-2024.0.28/tests/test_simulation.py +0 -67
  11. {sxs-2024.0.28 → sxs-2024.0.30}/.codecov.yml +0 -0
  12. {sxs-2024.0.28 → sxs-2024.0.30}/.github/dependabot.yml +0 -0
  13. {sxs-2024.0.28 → sxs-2024.0.30}/.github/scripts/parse_bump_rule.py +0 -0
  14. {sxs-2024.0.28 → sxs-2024.0.30}/.github/workflows/pr_rtd_link.yml +0 -0
  15. {sxs-2024.0.28 → sxs-2024.0.30}/.gitignore +0 -0
  16. {sxs-2024.0.28 → sxs-2024.0.30}/.readthedocs.yaml +0 -0
  17. {sxs-2024.0.28 → sxs-2024.0.30}/LICENSE +0 -0
  18. {sxs-2024.0.28 → sxs-2024.0.30}/README.md +0 -0
  19. {sxs-2024.0.28 → sxs-2024.0.30}/docs/api/catalog.md +0 -0
  20. {sxs-2024.0.28 → sxs-2024.0.30}/docs/api/horizons.md +0 -0
  21. {sxs-2024.0.28 → sxs-2024.0.30}/docs/api/load.md +0 -0
  22. {sxs-2024.0.28 → sxs-2024.0.30}/docs/api/metadata.md +0 -0
  23. {sxs-2024.0.28 → sxs-2024.0.30}/docs/api/simulation.md +0 -0
  24. {sxs-2024.0.28 → sxs-2024.0.30}/docs/api/simulations.md +0 -0
  25. {sxs-2024.0.28 → sxs-2024.0.30}/docs/api/time_series.md +0 -0
  26. {sxs-2024.0.28 → sxs-2024.0.30}/docs/api/waveforms.md +0 -0
  27. {sxs-2024.0.28 → sxs-2024.0.30}/docs/html/main.html +0 -0
  28. {sxs-2024.0.28 → sxs-2024.0.30}/docs/images/favicon.ico +0 -0
  29. {sxs-2024.0.28 → sxs-2024.0.30}/docs/index.md +0 -0
  30. {sxs-2024.0.28 → sxs-2024.0.30}/docs/javascript/mathjax.js +0 -0
  31. {sxs-2024.0.28 → sxs-2024.0.30}/docs/julia.md +0 -0
  32. {sxs-2024.0.28 → sxs-2024.0.30}/docs/mathematica.md +0 -0
  33. {sxs-2024.0.28 → sxs-2024.0.30}/docs/stylesheets/extra.css +0 -0
  34. {sxs-2024.0.28 → sxs-2024.0.30}/docs/tutorials/00-Introduction.ipynb +0 -0
  35. {sxs-2024.0.28 → sxs-2024.0.30}/docs/tutorials/01-Simulations_and_Metadata.ipynb +0 -0
  36. {sxs-2024.0.28 → sxs-2024.0.30}/docs/tutorials/02-Simulation.ipynb +0 -0
  37. {sxs-2024.0.28 → sxs-2024.0.30}/docs/tutorials/03-Horizons.ipynb +0 -0
  38. {sxs-2024.0.28 → sxs-2024.0.30}/docs/tutorials/04-Waveforms.ipynb +0 -0
  39. {sxs-2024.0.28 → sxs-2024.0.30}/docs/tutorials/05-PreprocessingForFFTs.ipynb +0 -0
  40. {sxs-2024.0.28 → sxs-2024.0.30}/mkdocs.yml +0 -0
  41. {sxs-2024.0.28 → sxs-2024.0.30}/pyproject.toml +0 -0
  42. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/__init__.py +0 -0
  43. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/caltechdata/__init__.py +0 -0
  44. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/caltechdata/catalog.py +0 -0
  45. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/caltechdata/login.py +0 -0
  46. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/catalog/__init__.py +0 -0
  47. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/catalog/catalog.py +0 -0
  48. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/catalog/create.py +0 -0
  49. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/catalog/description.py +0 -0
  50. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/handlers.py +0 -0
  51. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/horizons/__init__.py +0 -0
  52. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/horizons/spec_horizons_h5.py +0 -0
  53. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/horizons/xor_multishuffle_bzip2.py +0 -0
  54. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/julia/GWFrames.py +0 -0
  55. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/julia/__init__.py +0 -0
  56. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/juliapkg.json +0 -0
  57. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/metadata/__init__.py +0 -0
  58. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/simulations/__init__.py +0 -0
  59. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/simulations/local.py +0 -0
  60. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/time_series.py +0 -0
  61. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/__init__.py +0 -0
  62. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/bitwise.py +0 -0
  63. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/decimation/__init__.py +0 -0
  64. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/decimation/greedy_spline.py +0 -0
  65. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/decimation/linear_bisection.py +0 -0
  66. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/decimation/peak_greed.py +0 -0
  67. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/decimation/suppression.py +0 -0
  68. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/dicts.py +0 -0
  69. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/downloads.py +0 -0
  70. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/files.py +0 -0
  71. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/formats.py +0 -0
  72. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/inspire.py +0 -0
  73. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/lvcnr/__init__.py +0 -0
  74. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/lvcnr/comparisons.py +0 -0
  75. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/lvcnr/conversion.py +0 -0
  76. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/lvcnr/dataset.py +0 -0
  77. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/lvcnr/horizons.py +0 -0
  78. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/lvcnr/metadata.py +0 -0
  79. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/lvcnr/waveform_amp_phase.py +0 -0
  80. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/lvcnr/waveforms.py +0 -0
  81. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/monotonicity.py +0 -0
  82. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/pretty_print.py +0 -0
  83. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/references/__init__.py +0 -0
  84. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/references/ads.py +0 -0
  85. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/references/arxiv.py +0 -0
  86. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/references/fairchild_report.py +0 -0
  87. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/references/inspire.py +0 -0
  88. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/references/journal_abbreviations.py +0 -0
  89. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/references/references.py +0 -0
  90. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/select.py +0 -0
  91. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/smooth_functions.py +0 -0
  92. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/sxs_directories.py +0 -0
  93. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/sxs_identifiers.py +0 -0
  94. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/utilities/url.py +0 -0
  95. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/waveforms/__init__.py +0 -0
  96. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/waveforms/alignment.py +0 -0
  97. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/waveforms/format_handlers/__init__.py +0 -0
  98. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/waveforms/format_handlers/grathena.py +0 -0
  99. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/waveforms/format_handlers/lvc.py +0 -0
  100. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/waveforms/format_handlers/nrar.py +0 -0
  101. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/waveforms/format_handlers/rotating_paired_diff_multishuffle_bzip2.py +0 -0
  102. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/waveforms/format_handlers/rotating_paired_xor_multishuffle_bzip2.py +0 -0
  103. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/waveforms/format_handlers/spectre_cce_v1.py +0 -0
  104. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/waveforms/memory.py +0 -0
  105. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/waveforms/mode_utilities.py +0 -0
  106. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/waveforms/transformations.py +0 -0
  107. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/waveforms/waveform_grid.py +0 -0
  108. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/waveforms/waveform_mixin.py +0 -0
  109. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/waveforms/waveform_modes.py +0 -0
  110. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/waveforms/waveform_signal.py +0 -0
  111. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/zenodo/__init__.py +0 -0
  112. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/zenodo/api/__init__.py +0 -0
  113. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/zenodo/api/deposit.py +0 -0
  114. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/zenodo/api/login.py +0 -0
  115. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/zenodo/api/records.py +0 -0
  116. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/zenodo/catalog.py +0 -0
  117. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/zenodo/creators.py +0 -0
  118. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/zenodo/simannex.py +0 -0
  119. {sxs-2024.0.28 → sxs-2024.0.30}/sxs/zenodo/surrogatemodeling.py +0 -0
  120. {sxs-2024.0.28 → sxs-2024.0.30}/tests/__init__.py +0 -0
  121. {sxs-2024.0.28 → sxs-2024.0.30}/tests/conftest.py +0 -0
  122. {sxs-2024.0.28 → sxs-2024.0.30}/tests/test_catalog.py +0 -0
  123. {sxs-2024.0.28 → sxs-2024.0.30}/tests/test_horizons.py +0 -0
  124. {sxs-2024.0.28 → sxs-2024.0.30}/tests/test_julia.py +0 -0
  125. {sxs-2024.0.28 → sxs-2024.0.30}/tests/test_loader.py +0 -0
  126. {sxs-2024.0.28 → sxs-2024.0.30}/tests/test_metadata.py +0 -0
  127. {sxs-2024.0.28 → sxs-2024.0.30}/tests/test_time_series.py +0 -0
  128. {sxs-2024.0.28 → sxs-2024.0.30}/tests/test_transformations.py +0 -0
  129. {sxs-2024.0.28 → sxs-2024.0.30}/tests/test_utilities.py +0 -0
  130. {sxs-2024.0.28 → sxs-2024.0.30}/tests/test_waveform_rotations.py +0 -0
  131. {sxs-2024.0.28 → sxs-2024.0.30}/tests/test_waveforms.py +0 -0
@@ -30,7 +30,10 @@ jobs:
30
30
  fail-fast: false
31
31
  matrix:
32
32
  os: [ubuntu-latest, macos-latest, windows-latest]
33
- python-version: ['3.10', '3.12']
33
+ python-version: ['3.10', '3.13']
34
+ exclude:
35
+ - os: windows-latest
36
+ python-version: '3.13'
34
37
 
35
38
  steps:
36
39
  - name: Skip replicates on main branch
@@ -78,7 +81,7 @@ jobs:
78
81
  run: hatch run test
79
82
 
80
83
  - name: Upload coverage
81
- if: "matrix.python-version == '3.12' && matrix.os == 'ubuntu-latest'"
84
+ if: "matrix.python-version == '3.13' && matrix.os == 'ubuntu-latest'"
82
85
  uses: codecov/codecov-action@v5
83
86
  with:
84
87
  token: ${{ secrets.CODECOV_TOKEN }}
@@ -98,10 +101,10 @@ jobs:
98
101
  - name: Check out code
99
102
  uses: actions/checkout@v4
100
103
 
101
- - name: Set up Python ${{ matrix.python-version }}
104
+ - name: Set up Python
102
105
  uses: actions/setup-python@v5
103
106
  with:
104
- python-version: ${{ matrix.python-version }}
107
+ python-version: '3.13'
105
108
 
106
109
  - name: Install Hatch
107
110
  run: python -m pip install --disable-pip-version-check --upgrade hatch
@@ -168,28 +171,3 @@ jobs:
168
171
  run: |
169
172
  hatch build
170
173
  hatch publish
171
-
172
-
173
- binder:
174
- name: Trigger a binder rebuild
175
- needs: release
176
- runs-on: ubuntu-latest
177
- if: >-
178
- github.ref == 'refs/heads/main'
179
- && !contains(github.event.head_commit.message, '[no release]')
180
- && (success() || contains(github.event.head_commit.message, '[skip tests]'))
181
-
182
- steps:
183
- - name: Trigger other repository
184
- # I created a new personal access token via github profile > settings > developer settings >
185
- # personal access tokens. I clicked the "repo" checkbox, created the token, and copied it.
186
- # Then, I went to this repo's settings > secrets, and created a new secret named
187
- # "MOBLE_TOKEN" with a value of "moble:<token>", where <token> is the copied token. This
188
- # command sends a POST to the other repo, which is set up to build on `workflow_dispatch`.
189
- run: |
190
- curl \
191
- -X POST \
192
- -H "Accept: application/vnd.github.v3+json" \
193
- -u ${{ secrets.MOBLE_TOKEN }} \
194
- https://api.github.com/repos/moble/sxs_notebooks/actions/workflows/binder.yml/dispatches \
195
- -d '{"ref":"refs/heads/master"}'
@@ -10,5 +10,5 @@ authors:
10
10
  title: "The sxs package"
11
11
  license: MIT
12
12
  doi: 10.5281/zenodo.4034006
13
- version: 2024.0.28
14
- date-released: 2025-01-31
13
+ version: 2024.0.30
14
+ date-released: 2025-02-13
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sxs
3
- Version: 2024.0.28
3
+ Version: 2024.0.30
4
4
  Summary: Interface to data produced by the Simulating eXtreme Spacetimes collaboration
5
5
  Project-URL: Homepage, https://github.com/sxs-collaboration/sxs
6
6
  Project-URL: Documentation, https://sxs.readthedocs.io/
@@ -0,0 +1 @@
1
+ __version__ = "2024.0.30"
@@ -23,6 +23,17 @@ def _valid_identifier_to_metadata_key(key):
23
23
  return _metadata_key_map.get(key, key.replace('_', '-'))
24
24
 
25
25
 
26
+ def _backwards_compatibility(metadata):
27
+ """Deal with the fact that keys have been removed/renamed"""
28
+ # See also `sxs.simulations.simulations.Simulations.dataframe`;
29
+ # it's probably a good idea to duplicate whatever is included here
30
+ # in that function, just to make sure nothing slips through the
31
+ # cracks.
32
+ if "number_of_orbits" not in metadata and "number_of_orbits_from_start" in metadata:
33
+ metadata["number_of_orbits"] = metadata["number_of_orbits_from_start"]
34
+ return metadata
35
+
36
+
26
37
  class Metadata(collections.OrderedDict):
27
38
  """Interface to metadata
28
39
 
@@ -72,25 +83,27 @@ class Metadata(collections.OrderedDict):
72
83
  txt_path = path.with_suffix(".txt")
73
84
 
74
85
  if path.suffix == ".json":
75
- return cls.from_json_file(json_path)
86
+ metadata = cls.from_json_file(json_path)
76
87
  elif path.suffix == ".txt":
77
- return cls.from_txt_file(txt_path, ignore_invalid_lines=ignore_invalid_lines, cache_json=cache_json)
88
+ metadata = cls.from_txt_file(txt_path, ignore_invalid_lines=ignore_invalid_lines, cache_json=cache_json)
78
89
  else:
79
90
  json_exists = json_path.exists()
80
91
  txt_exists = txt_path.exists()
81
92
  if json_exists and not txt_exists:
82
- return cls.from_json_file(json_path)
93
+ metadata = cls.from_json_file(json_path)
83
94
  elif txt_exists and not json_exists:
84
- return cls.from_txt_file(txt_path, ignore_invalid_lines=ignore_invalid_lines, cache_json=cache_json)
95
+ metadata = cls.from_txt_file(txt_path, ignore_invalid_lines=ignore_invalid_lines, cache_json=cache_json)
85
96
  elif json_exists and txt_exists:
86
97
  json_time = json_path.stat().st_mtime
87
98
  txt_time = txt_path.stat().st_mtime
88
99
  if txt_time > json_time:
89
- return cls.from_txt_file(txt_path, ignore_invalid_lines=ignore_invalid_lines, cache_json=cache_json)
100
+ metadata = cls.from_txt_file(txt_path, ignore_invalid_lines=ignore_invalid_lines, cache_json=cache_json)
90
101
  else:
91
- return cls.from_json_file(json_path)
102
+ metadata = cls.from_json_file(json_path)
92
103
  else:
93
104
  raise ValueError(f"Could not find file named '{json_path}' or '{txt_path}'")
105
+
106
+ return _backwards_compatibility(metadata)
94
107
 
95
108
  load = from_file
96
109
 
@@ -113,7 +126,7 @@ class Metadata(collections.OrderedDict):
113
126
  """
114
127
  import json
115
128
  # noinspection PyTypeChecker
116
- return json.load(json_data, object_pairs_hook=cls)
129
+ return _backwards_compatibility(json.load(json_data, object_pairs_hook=cls))
117
130
 
118
131
  @classmethod
119
132
  def from_json_file(cls, json_file):
@@ -136,7 +149,7 @@ class Metadata(collections.OrderedDict):
136
149
  # noinspection PyTypeChecker
137
150
  metadata = json.load(metadata_file, object_pairs_hook=cls)
138
151
  metadata["metadata_path"] = str(json_file)
139
- return metadata
152
+ return _backwards_compatibility(metadata)
140
153
 
141
154
  @classmethod
142
155
  def from_txt_file(cls, txt_file, ignore_invalid_lines=False, cache_json=True):
@@ -259,7 +272,7 @@ class Metadata(collections.OrderedDict):
259
272
  metadata.to_json_file(path.with_suffix(".json"))
260
273
 
261
274
  metadata["metadata_path"] = str(txt_file)
262
- return metadata
275
+ return _backwards_compatibility(metadata)
263
276
 
264
277
  def to_json(self, indent=4, separators=(",", ": ")):
265
278
  """Export to JSON string"""
@@ -133,7 +133,7 @@ def Simulation(location, *args, **kwargs):
133
133
  url = f"{doi_url}{sxs_id}"
134
134
 
135
135
  # Deal with "superseded_by" field, or "deprecated" keyword in the metadata
136
- deprecated = ("deprecated" in metadata.get("keywords", []) or metadata.get("superseded_by", False))
136
+ deprecated = ("deprecated" in metadata.get("keywords", []) )#or metadata.get("superseded_by", False))
137
137
  if not kwargs.get("ignore_deprecation", False):
138
138
  auto_supersede = kwargs.get("auto_supersede", read_config("auto_supersede", False))
139
139
  if (
@@ -160,6 +160,12 @@ def Simulation(location, *args, **kwargs):
160
160
  + "specify a version to load this waveform anyway."
161
161
  )
162
162
  elif auto_supersede and isinstance(superseded_by, str):
163
+ # raise NotImplementedError(
164
+ # f"\nSimulation '{sxs_id}' cannot be automatically superseded.\n"
165
+ # + "The auto_supersede option is temporarily disabled. The superseding\n"
166
+ # + "simulations have been removed from the metadata, and the new function\n"
167
+ # + "to load them has not yet been implemented. Please specify a version.\n"
168
+ # )
163
169
  message = f"\nSimulation '{sxs_id}' is being automatically superseded by '{superseded_by}'."
164
170
  warn(message)
165
171
  new_location = f"{superseded_by}{input_version}"
@@ -404,6 +404,18 @@ class Simulations(collections.OrderedDict):
404
404
 
405
405
  simulations = pd.DataFrame.from_dict(self, orient="index")
406
406
 
407
+ # See also below for "number_of_orbits" field.
408
+ # See also `sxs.metadata.metadata._backwards_compatibility`;
409
+ # it's probably a good idea to duplicate whatever is included
410
+ # here in that function, just to make sure nothing slips
411
+ # through the cracks.
412
+ for col in [
413
+ "number_of_orbits", "number_of_orbits_from_start",
414
+ "number_of_orbits_from_reference_time"
415
+ ]:
416
+ if col not in simulations.columns:
417
+ simulations[col] = np.nan
418
+
407
419
  def floater(x):
408
420
  try:
409
421
  f = float(x)
@@ -509,7 +521,9 @@ class Simulations(collections.OrderedDict):
509
521
  # simulations["end_of_trajectory_time"].map(floater),
510
522
  # simulations["merger_time"].map(floater),
511
523
  simulations["number_of_orbits"].map(floater),
512
- simulations["superseded_by"],
524
+ simulations["number_of_orbits_from_start"].map(floater),
525
+ simulations["number_of_orbits_from_reference_time"].map(floater),
526
+ # simulations["superseded_by"],
513
527
  simulations["DOI_versions"],
514
528
  simulations["keywords"],
515
529
  simulations["date_link_earliest"].map(datetime_from_string),
@@ -519,10 +533,18 @@ class Simulations(collections.OrderedDict):
519
533
  ), axis=1))
520
534
 
521
535
  sims_df.insert(0, "deprecated", (
522
- ~sims_df.superseded_by.isna()
523
- | sims_df["keywords"].map(lambda ks: "deprecated" in ks)
536
+ # ~sims_df.superseded_by.isna() |
537
+ sims_df["keywords"].map(lambda ks: "deprecated" in ks)
524
538
  ))
525
539
 
540
+ # See also `sxs.metadata.metadata._backwards_compatibility`;
541
+ # it's probably a good idea to duplicate whatever is included
542
+ # here in that function, just to make sure nothing slips
543
+ # through the cracks.
544
+ sims_df["number_of_orbits"] = sims_df["number_of_orbits"].fillna(
545
+ sims_df["number_of_orbits_from_start"]
546
+ )
547
+
526
548
  # We have ignored the following fields present in the
527
549
  # simulations.json file (as of 2024-08-04), listed here with
528
550
  # the number of non-null entries:
@@ -0,0 +1,67 @@
1
+ import pytest
2
+ import sxs
3
+ from .conftest import skip_macOS_GH_actions_downloads
4
+
5
+
6
+ def test_sxs_load_v2():
7
+ s = sxs.load("SXS:BBH:0001v2.0")
8
+ assert s.sxs_id_stem == "SXS:BBH:0001"
9
+ assert s.version == "v2.0"
10
+ s.h
11
+ s.horizons
12
+
13
+
14
+ # @skip_macOS_GH_actions_downloads
15
+ # @pytest.mark.parametrize("loader", [sxs.Simulation, sxs.load])
16
+ # def test_superseded_by_single(loader):
17
+ # simulation = "SXS:BBH:0001"
18
+ # # NOTE: These tests as written will only work so long as only one
19
+ # # simulation is listed in the given simulation's `superseded_by`
20
+ # # field. If more are added, this test will need to be changed to
21
+ # # use a simulation that still has just one.
22
+ # with pytest.raises(ValueError):
23
+ # loader(f"{simulation}")
24
+ # with pytest.warns(UserWarning):
25
+ # s = loader(f"{simulation}v2.0")
26
+ # assert s.sxs_id_stem == simulation
27
+ # s = loader(f"{simulation}", ignore_deprecation=True)
28
+ # assert s.sxs_id_stem == simulation
29
+ # s = loader(f"{simulation}v2.0", ignore_deprecation=True)
30
+ # assert s.sxs_id_stem == simulation
31
+ # with pytest.warns(UserWarning):
32
+ # s = loader(f"{simulation}", auto_supersede=True)
33
+ # assert s.sxs_id_stem != simulation
34
+ # with pytest.warns(UserWarning):
35
+ # s = loader(f"{simulation}v2.0", auto_supersede=True)
36
+ # assert s.sxs_id_stem != simulation
37
+ # s = loader(f"{simulation}", ignore_deprecation=True, auto_supersede=True)
38
+ # assert s.sxs_id_stem == simulation
39
+ # s = loader(f"{simulation}v2.0", ignore_deprecation=True, auto_supersede=True)
40
+ # assert s.sxs_id_stem == simulation
41
+
42
+
43
+ # @skip_macOS_GH_actions_downloads
44
+ # @pytest.mark.parametrize("loader", [sxs.Simulation, sxs.load])
45
+ # def test_superseded_by_multiple(loader):
46
+ # simulation = "SXS:BBH:0030"
47
+ # # NOTE: These tests assume that multiple simulations are listed in
48
+ # # the given simulation's `superseded_by` field. If that changes
49
+ # # for some reason, this test will need to be changed to use a
50
+ # # simulation that still has multiple simulations.
51
+ # with pytest.raises(ValueError):
52
+ # loader(f"{simulation}")
53
+ # with pytest.warns(UserWarning):
54
+ # s = loader(f"{simulation}v2.0")
55
+ # assert s.sxs_id_stem == simulation
56
+ # s = loader(f"{simulation}", ignore_deprecation=True)
57
+ # assert s.sxs_id_stem == simulation
58
+ # s = loader(f"{simulation}v2.0", ignore_deprecation=True)
59
+ # assert s.sxs_id_stem == simulation
60
+ # with pytest.raises(ValueError):
61
+ # loader(f"{simulation}", auto_supersede=True)
62
+ # with pytest.raises(ValueError):
63
+ # loader(f"{simulation}v2.0", auto_supersede=True)
64
+ # s = loader(f"{simulation}", ignore_deprecation=True, auto_supersede=True)
65
+ # assert s.sxs_id_stem == simulation
66
+ # s = loader(f"{simulation}v2.0", ignore_deprecation=True, auto_supersede=True)
67
+ # assert s.sxs_id_stem == simulation
@@ -1 +0,0 @@
1
- __version__ = "2024.0.28"
@@ -1,67 +0,0 @@
1
- import pytest
2
- import sxs
3
- from .conftest import skip_macOS_GH_actions_downloads
4
-
5
-
6
- def test_sxs_load_v2():
7
- s = sxs.load("SXS:BBH:0001v2.0")
8
- assert s.sxs_id_stem == "SXS:BBH:0001"
9
- assert s.version == "v2.0"
10
- s.h
11
- s.horizons
12
-
13
-
14
- @skip_macOS_GH_actions_downloads
15
- @pytest.mark.parametrize("loader", [sxs.Simulation, sxs.load])
16
- def test_superseded_by_single(loader):
17
- simulation = "SXS:BBH:0001"
18
- # NOTE: These tests as written will only work so long as only one
19
- # simulation is listed in the given simulation's `superseded_by`
20
- # field. If more are added, this test will need to be changed to
21
- # use a simulation that still has just one.
22
- with pytest.raises(ValueError):
23
- loader(f"{simulation}")
24
- with pytest.warns(UserWarning):
25
- s = loader(f"{simulation}v2.0")
26
- assert s.sxs_id_stem == simulation
27
- s = loader(f"{simulation}", ignore_deprecation=True)
28
- assert s.sxs_id_stem == simulation
29
- s = loader(f"{simulation}v2.0", ignore_deprecation=True)
30
- assert s.sxs_id_stem == simulation
31
- with pytest.warns(UserWarning):
32
- s = loader(f"{simulation}", auto_supersede=True)
33
- assert s.sxs_id_stem != simulation
34
- with pytest.warns(UserWarning):
35
- s = loader(f"{simulation}v2.0", auto_supersede=True)
36
- assert s.sxs_id_stem != simulation
37
- s = loader(f"{simulation}", ignore_deprecation=True, auto_supersede=True)
38
- assert s.sxs_id_stem == simulation
39
- s = loader(f"{simulation}v2.0", ignore_deprecation=True, auto_supersede=True)
40
- assert s.sxs_id_stem == simulation
41
-
42
-
43
- @skip_macOS_GH_actions_downloads
44
- @pytest.mark.parametrize("loader", [sxs.Simulation, sxs.load])
45
- def test_superseded_by_multiple(loader):
46
- simulation = "SXS:BBH:0030"
47
- # NOTE: These tests assume that multiple simulations are listed in
48
- # the given simulation's `superseded_by` field. If that changes
49
- # for some reason, this test will need to be changed to use a
50
- # simulation that still has multiple simulations.
51
- with pytest.raises(ValueError):
52
- loader(f"{simulation}")
53
- with pytest.warns(UserWarning):
54
- s = loader(f"{simulation}v2.0")
55
- assert s.sxs_id_stem == simulation
56
- s = loader(f"{simulation}", ignore_deprecation=True)
57
- assert s.sxs_id_stem == simulation
58
- s = loader(f"{simulation}v2.0", ignore_deprecation=True)
59
- assert s.sxs_id_stem == simulation
60
- with pytest.raises(ValueError):
61
- loader(f"{simulation}", auto_supersede=True)
62
- with pytest.raises(ValueError):
63
- loader(f"{simulation}v2.0", auto_supersede=True)
64
- s = loader(f"{simulation}", ignore_deprecation=True, auto_supersede=True)
65
- assert s.sxs_id_stem == simulation
66
- s = loader(f"{simulation}v2.0", ignore_deprecation=True, auto_supersede=True)
67
- assert s.sxs_id_stem == simulation
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
File without changes