astrox-python 1.2.1__tar.gz → 1.2.2__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 (353) hide show
  1. {astrox_python-1.2.1 → astrox_python-1.2.2}/PKG-INFO +1 -1
  2. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/how_to/compute_lambert_transfer.md +1 -0
  3. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/how_to/compute_lambert_transfer.md +1 -0
  4. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/manual/celestial/README.md +1 -0
  5. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/manual/celestial/README.md +1 -0
  6. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/validation/celestial.md +3 -2
  7. {astrox_python-1.2.1 → astrox_python-1.2.2}/pyproject.toml +2 -2
  8. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/celestial/test_celestial.py +14 -2
  9. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/celestial/test_lambert_transfer_lamberthub.py +103 -1
  10. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/celestial/celestial.snap.json +67 -3
  11. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/celestial/test_celestial.py +26 -5
  12. {astrox_python-1.2.1 → astrox_python-1.2.2}/uv.lock +7 -7
  13. {astrox_python-1.2.1 → astrox_python-1.2.2}/.gitignore +0 -0
  14. {astrox_python-1.2.1 → astrox_python-1.2.2}/LICENSE +0 -0
  15. {astrox_python-1.2.1 → astrox_python-1.2.2}/README.md +0 -0
  16. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/__init__.py +0 -0
  17. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/_http.py +0 -0
  18. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/access.py +0 -0
  19. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/astrogator/__init__.py +0 -0
  20. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/astrogator/_api.py +0 -0
  21. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/astrogator/_models.py +0 -0
  22. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/astrogator/_results.py +0 -0
  23. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/cat.py +0 -0
  24. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/catalog.py +0 -0
  25. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/celestial.py +0 -0
  26. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/components/__init__.py +0 -0
  27. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/components/_axes.py +0 -0
  28. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/components/_common.py +0 -0
  29. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/components/_constraints.py +0 -0
  30. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/components/_objects.py +0 -0
  31. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/components/_positions.py +0 -0
  32. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/components/_rotations.py +0 -0
  33. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/components/_sensors.py +0 -0
  34. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/components/_vgt.py +0 -0
  35. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/conjunction.py +0 -0
  36. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/coverage/__init__.py +0 -0
  37. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/coverage/_core.py +0 -0
  38. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/coverage/_fom.py +0 -0
  39. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/coverage/coverage_time.py +0 -0
  40. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/coverage/number_of_assets.py +0 -0
  41. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/coverage/response_time.py +0 -0
  42. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/coverage/revisit_time.py +0 -0
  43. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/coverage/simple_coverage.py +0 -0
  44. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/exceptions.py +0 -0
  45. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/libration.py +0 -0
  46. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/lighting.py +0 -0
  47. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/orbits.py +0 -0
  48. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/propagator.py +0 -0
  49. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/rocket.py +0 -0
  50. {astrox_python-1.2.1 → astrox_python-1.2.2}/astrox/terrain.py +0 -0
  51. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/CONTRIBUTING.md +0 -0
  52. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/README.md +0 -0
  53. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/automated-workflows.md +0 -0
  54. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/docs-principles.md +0 -0
  55. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/getting_started.md +0 -0
  56. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/how_to/README.md +0 -0
  57. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/how_to/build_an_hpop_configuration.md +0 -0
  58. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/how_to/compute_access_intervals.md +0 -0
  59. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/how_to/compute_lighting_conditions.md +0 -0
  60. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/how_to/convert_between_orbit_representations.md +0 -0
  61. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/how_to/generate_a_crtbp_periodic_orbit.md +0 -0
  62. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/how_to/propagate_an_orbit.md +0 -0
  63. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/how_to/run_an_astrogator_mcs.md +0 -0
  64. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/how_to/screen_close_approaches.md +0 -0
  65. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/README.md +0 -0
  66. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/getting_started.md +0 -0
  67. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/how_to/README.md +0 -0
  68. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/how_to/build_an_hpop_configuration.md +0 -0
  69. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/how_to/compute_access_intervals.md +0 -0
  70. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/how_to/compute_lighting_conditions.md +0 -0
  71. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/how_to/convert_between_orbit_representations.md +0 -0
  72. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/how_to/generate_a_crtbp_periodic_orbit.md +0 -0
  73. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/how_to/propagate_an_orbit.md +0 -0
  74. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/how_to/run_an_astrogator_mcs.md +0 -0
  75. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/how_to/screen_close_approaches.md +0 -0
  76. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/manual/README.md +0 -0
  77. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/manual/access/README.md +0 -0
  78. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/manual/astrogator/README.md +0 -0
  79. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/manual/cat/README.md +0 -0
  80. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/manual/catalog/README.md +0 -0
  81. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/manual/components/README.md +0 -0
  82. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/manual/conjunction/README.md +0 -0
  83. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/manual/coverage/README.md +0 -0
  84. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/manual/libration/README.md +0 -0
  85. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/manual/lighting/README.md +0 -0
  86. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/manual/orbits/README.md +0 -0
  87. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/manual/propagator/README.md +0 -0
  88. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/manual/rocket/README.md +0 -0
  89. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/i18n/en/manual/terrain/README.md +0 -0
  90. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/manual/README.md +0 -0
  91. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/manual/access/README.md +0 -0
  92. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/manual/astrogator/README.md +0 -0
  93. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/manual/cat/README.md +0 -0
  94. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/manual/catalog/README.md +0 -0
  95. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/manual/components/README.md +0 -0
  96. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/manual/conjunction/README.md +0 -0
  97. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/manual/coverage/README.md +0 -0
  98. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/manual/libration/README.md +0 -0
  99. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/manual/lighting/README.md +0 -0
  100. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/manual/orbits/README.md +0 -0
  101. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/manual/propagator/README.md +0 -0
  102. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/manual/rocket/README.md +0 -0
  103. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/manual/terrain/README.md +0 -0
  104. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/sdk-principles.md +0 -0
  105. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/test-principles.md +0 -0
  106. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/validation/README.md +0 -0
  107. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/validation/access.md +0 -0
  108. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/validation/astrogator.md +0 -0
  109. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/validation/cat.md +0 -0
  110. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/validation/catalog.md +0 -0
  111. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/validation/conjunction.md +0 -0
  112. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/validation/coverage.md +0 -0
  113. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/validation/libration.md +0 -0
  114. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/validation/lighting.md +0 -0
  115. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/validation/orbits.md +0 -0
  116. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/validation/propagator.md +0 -0
  117. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/validation/rocket.md +0 -0
  118. {astrox_python-1.2.1 → astrox_python-1.2.2}/docs/validation/terrain.md +0 -0
  119. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/01_propagation/README.md +0 -0
  120. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/01_propagation/ballistic_apogee_alt.py +0 -0
  121. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/01_propagation/ballistic_delta_v.py +0 -0
  122. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/01_propagation/ballistic_min_ecc.py +0 -0
  123. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/01_propagation/ballistic_time_of_flight.py +0 -0
  124. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/01_propagation/batch_propagators.py +0 -0
  125. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/01_propagation/hpop.py +0 -0
  126. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/01_propagation/j2_classical.py +0 -0
  127. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/01_propagation/propagator_reference.py +0 -0
  128. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/01_propagation/sgp4_tle.py +0 -0
  129. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/01_propagation/simple_ascent.py +0 -0
  130. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/01_propagation/two_body_classical.py +0 -0
  131. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/01_propagation/two_body_rv.py +0 -0
  132. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/02_orbits/README.md +0 -0
  133. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/02_orbits/conversions.py +0 -0
  134. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/02_orbits/lambert_delta_v.py +0 -0
  135. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/02_orbits/orbit_system.py +0 -0
  136. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/02_orbits/wizards.py +0 -0
  137. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/03_lighting/README.md +0 -0
  138. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/03_lighting/lighting.py +0 -0
  139. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/04_access/README.md +0 -0
  140. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/04_access/chain.py +0 -0
  141. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/04_access/compute.py +0 -0
  142. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/04_access/constraints.py +0 -0
  143. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/04_access/custom_axes.py +0 -0
  144. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/04_access/sensor_pointing.py +0 -0
  145. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/05_rocket/README.md +0 -0
  146. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/05_rocket/landing_zone.py +0 -0
  147. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/06_coverage/README.md +0 -0
  148. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/06_coverage/compute.py +0 -0
  149. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/06_coverage/fom.py +0 -0
  150. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/06_coverage/grid_points.py +0 -0
  151. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/06_coverage/reports.py +0 -0
  152. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/07_astrogator/run_mcs.py +0 -0
  153. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/08_conjunction/README.md +0 -0
  154. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/08_conjunction/close_approaches.py +0 -0
  155. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/09_cat/README.md +0 -0
  156. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/09_cat/cat_workflows.py +0 -0
  157. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/10_catalog/README.md +0 -0
  158. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/10_catalog/catalog_queries.py +0 -0
  159. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/11_celestial/README.md +0 -0
  160. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/11_celestial/celestial_queries.py +0 -0
  161. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/12_terrain/README.md +0 -0
  162. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/12_terrain/terrain_masks.py +0 -0
  163. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/13_libration/README.md +0 -0
  164. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/13_libration/libration_dynamics.py +0 -0
  165. {astrox_python-1.2.1 → astrox_python-1.2.2}/examples/manifest.toml +0 -0
  166. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/README.md +0 -0
  167. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/conftest.py +0 -0
  168. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/access/helpers.py +0 -0
  169. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/access/test_chain.py +0 -0
  170. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/access/test_compute.py +0 -0
  171. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/access/test_values.py +0 -0
  172. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/astrogator/test_api.py +0 -0
  173. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/astrogator/test_models.py +0 -0
  174. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/astrogator/test_results.py +0 -0
  175. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/cat/test_cat.py +0 -0
  176. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/catalog/test_catalog.py +0 -0
  177. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/client/test_client.py +0 -0
  178. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/components/test_components.py +0 -0
  179. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/conjunction/test_conjunction.py +0 -0
  180. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/coverage/test_coverage.py +0 -0
  181. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/coverage/test_coverage_fom.py +0 -0
  182. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/helpers.py +0 -0
  183. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/libration/test_libration.py +0 -0
  184. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/lighting/test_lighting.py +0 -0
  185. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/orbits/helpers.py +0 -0
  186. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/orbits/test_conversions.py +0 -0
  187. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/orbits/test_keplerian.py +0 -0
  188. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/orbits/test_orbit_system.py +0 -0
  189. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/orbits/test_tle.py +0 -0
  190. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/orbits/test_wizards.py +0 -0
  191. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/propagator/helpers.py +0 -0
  192. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/propagator/test_ballistic.py +0 -0
  193. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/propagator/test_hpop.py +0 -0
  194. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/propagator/test_j2_two_body.py +0 -0
  195. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/propagator/test_multi.py +0 -0
  196. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/propagator/test_public_contract.py +0 -0
  197. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/propagator/test_sgp4_simple_ascent.py +0 -0
  198. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/propagator/test_two_body_rv.py +0 -0
  199. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/rocket/__init__.py +0 -0
  200. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/rocket/test_rocket.py +0 -0
  201. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/sdk/terrain/test_terrain.py +0 -0
  202. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/README.md +0 -0
  203. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/_external/gmat/README.md +0 -0
  204. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/_external/gmat/hpop_driver.py +0 -0
  205. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/_external/gmat/test_hpop_driver.py +0 -0
  206. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/_support/__init__.py +0 -0
  207. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/_support/contracts.py +0 -0
  208. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/_support/external_tools.py +0 -0
  209. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/_support/gmat.py +0 -0
  210. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/_support/orekit.py +0 -0
  211. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/_support/skyfield.py +0 -0
  212. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/_support/test_contracts.py +0 -0
  213. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/_support/test_external_tools.py +0 -0
  214. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/_support/test_gmat.py +0 -0
  215. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/_support/test_orekit.py +0 -0
  216. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/_support/test_skyfield.py +0 -0
  217. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/__init__.py +0 -0
  218. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/README.md +0 -0
  219. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/__init__.py +0 -0
  220. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/_aer.py +0 -0
  221. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/_cases.py +0 -0
  222. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/_constraints.py +0 -0
  223. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/_exclusion.py +0 -0
  224. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/_geometry.py +0 -0
  225. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/_mixed_model.py +0 -0
  226. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/_orientation.py +0 -0
  227. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_axes_orientation_geometry.py +0 -0
  228. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_chain_sgp4_skyfield.py +0 -0
  229. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_composite_czml_axes_geometry.py +0 -0
  230. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_compute_constraints_skyfield.py +0 -0
  231. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_compute_exclusion_constraints_invariants.py +0 -0
  232. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_compute_ground_sgp4_skyfield.py +0 -0
  233. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_compute_j2_two_body_geometry.py +0 -0
  234. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_compute_sgp4_j2_geometry.py +0 -0
  235. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_compute_site_hpop_geometry.py +0 -0
  236. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_compute_site_j2_geometry.py +0 -0
  237. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_compute_site_two_body_geometry.py +0 -0
  238. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_sensor_pointing_geometry.py +0 -0
  239. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_vgt_orientation_resolution.py +0 -0
  240. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/astrogator/__init__.py +0 -0
  241. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/astrogator/test_branch_semantics.py +0 -0
  242. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/astrogator/test_initial_state_conversions.py +0 -0
  243. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/astrogator/test_maneuver_invariants.py +0 -0
  244. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/astrogator/test_run_mcs_two_body_brahe.py +0 -0
  245. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/astrogator/test_scalar_invariants.py +0 -0
  246. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/astrogator/test_sequence_czml_brahe.py +0 -0
  247. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/astrogator/test_target_sequence_local.py +0 -0
  248. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/cat/test_cat_skyfield.py +0 -0
  249. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/celestial/test_cb_axes_rotation_invariants.py +0 -0
  250. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/celestial/test_ephemeris_skyfield.py +0 -0
  251. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/celestial/test_mpc_target_elements.py +0 -0
  252. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/conjunction/test_close_approaches_skyfield.py +0 -0
  253. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/_fom_helpers.py +0 -0
  254. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_exclusion_grid_constraints_skyfield.py +0 -0
  255. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_fom_at_time_boundaries_invariants.py +0 -0
  256. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_fom_edge_cases_invariants.py +0 -0
  257. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_fom_grid_options_invariants.py +0 -0
  258. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_fom_interval_invariants.py +0 -0
  259. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_fom_resource_options_invariants.py +0 -0
  260. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_fom_response_shapes_invariants.py +0 -0
  261. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_fom_response_time_dynamic_invariants.py +0 -0
  262. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_grid_generation_local.py +0 -0
  263. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_grid_point_modifiers_invariants.py +0 -0
  264. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_resource_reports_invariants.py +0 -0
  265. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_sgp4_grid_membership_skyfield.py +0 -0
  266. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/libration/_support.py +0 -0
  267. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/libration/test_cross_endpoint_consistency.py +0 -0
  268. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/libration/test_crtbp_trajectory.py +0 -0
  269. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/libration/test_e2m2e_qualification.py +0 -0
  270. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/libration/test_fixed_x_correction.py +0 -0
  271. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/libration/test_orekit_qualification.py +0 -0
  272. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/libration/test_periodic_families.py +0 -0
  273. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/libration/test_positions_and_units.py +0 -0
  274. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/lighting/__init__.py +0 -0
  275. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/lighting/test_site_sun_skyfield.py +0 -0
  276. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/lighting/test_spacecraft_solar_intensity_orekit.py +0 -0
  277. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/lighting/test_spacecraft_sun_skyfield.py +0 -0
  278. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/orbit_system/__init__.py +0 -0
  279. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/orbit_system/_support.py +0 -0
  280. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/orbit_system/test_convert_czml_position.py +0 -0
  281. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/orbit_system/test_earth_moon_libration.py +0 -0
  282. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/orbits/__init__.py +0 -0
  283. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/orbits/test_kozai_izsak_mean_elements_invariants.py +0 -0
  284. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/orbits/test_lambert_lamberthub.py +0 -0
  285. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/orbits/test_lambert_path_points.py +0 -0
  286. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/orbits/test_walker_constellation_equations.py +0 -0
  287. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/orbits/test_wizards_local_derivation.py +0 -0
  288. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/propagator/test_ballistic_geodetic.py +0 -0
  289. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/propagator/test_hpop_gmat.py +0 -0
  290. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/propagator/test_j2_analytical.py +0 -0
  291. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/propagator/test_multi_sgp4_skyfield.py +0 -0
  292. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/propagator/test_sgp4_skyfield.py +0 -0
  293. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/propagator/test_simple_ascent_geodetic.py +0 -0
  294. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/propagator/test_two_body_brahe.py +0 -0
  295. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/propagator/test_two_body_rv_brahe.py +0 -0
  296. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/rocket/__init__.py +0 -0
  297. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/rocket/test_landing_zone_geographiclib.py +0 -0
  298. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/cross_validation/terrain/test_terrain_mask_invariants.py +0 -0
  299. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/__init__.py +0 -0
  300. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/access/__init__.py +0 -0
  301. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/access/access.snap.json +0 -0
  302. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/access/test_access.py +0 -0
  303. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/access/test_chain_topology.py +0 -0
  304. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/access/test_compute_model_pairs.py +0 -0
  305. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/access/test_compute_options.py +0 -0
  306. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/astrogator/__init__.py +0 -0
  307. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/astrogator/run_mcs.snap.json +0 -0
  308. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/astrogator/test_run_mcs.py +0 -0
  309. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/cat/cat.snap.json +0 -0
  310. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/cat/test_cat.py +0 -0
  311. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/catalog/catalog.snap.json +0 -0
  312. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/catalog/test_catalog.py +0 -0
  313. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/conjunction/close_approaches.snap.json +0 -0
  314. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/conjunction/test_close_approaches.py +0 -0
  315. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/coverage/coverage.snap.json +0 -0
  316. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/coverage/test_coverage.py +0 -0
  317. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/libration/libration.snap.json +0 -0
  318. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/libration/test_libration.py +0 -0
  319. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/lighting/__init__.py +0 -0
  320. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/lighting/lighting.snap.json +0 -0
  321. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/lighting/test_lighting.py +0 -0
  322. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/orbits/__init__.py +0 -0
  323. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/orbits/conversions.snap.json +0 -0
  324. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/orbits/orbit_system.snap.json +0 -0
  325. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/orbits/test_conversion_roundtrip.py +0 -0
  326. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/orbits/test_conversions.py +0 -0
  327. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/orbits/test_orbit_system.py +0 -0
  328. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/orbits/test_wizards.py +0 -0
  329. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/orbits/wizards.snap.json +0 -0
  330. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/__init__.py +0 -0
  331. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/ballistic.snap.json +0 -0
  332. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/hpop.snap.json +0 -0
  333. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/j2.snap.json +0 -0
  334. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/multi_j2.snap.json +0 -0
  335. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/multi_sgp4.snap.json +0 -0
  336. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/multi_two_body.snap.json +0 -0
  337. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/sgp4.snap.json +0 -0
  338. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/simple_ascent.snap.json +0 -0
  339. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/test_ballistic.py +0 -0
  340. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/test_hpop.py +0 -0
  341. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/test_j2.py +0 -0
  342. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/test_multi_j2.py +0 -0
  343. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/test_multi_sgp4.py +0 -0
  344. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/test_multi_two_body.py +0 -0
  345. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/test_sgp4.py +0 -0
  346. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/test_simple_ascent.py +0 -0
  347. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/test_two_body.py +0 -0
  348. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/two_body.snap.json +0 -0
  349. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/rocket/__init__.py +0 -0
  350. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/rocket/landing_zone.snap.json +0 -0
  351. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/rocket/test_landing_zone.py +0 -0
  352. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/terrain/terrain.snap.json +0 -0
  353. {astrox_python-1.2.1 → astrox_python-1.2.2}/tests/validation/live_snapshot/terrain/test_terrain.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: astrox-python
3
- Version: 1.2.1
3
+ Version: 1.2.2
4
4
  Summary: Python SDK for the ASTROX Web API.
5
5
  Project-URL: Homepage, https://github.com/Mtrya/astrox-python
6
6
  Project-URL: Repository, https://github.com/Mtrya/astrox-python.git
@@ -62,6 +62,7 @@ python compute_lambert_transfer.py
62
62
  - `RV1`/`RV2`:出发/到达时的日心位置速度 `[x, y, z, vx, vy, vz]`(位置 m、速度 m/s);ICRF 分支下转移速度与独立 Lambert 解一致,端点位置方向与 ICRF 轴方向一致。
63
63
  - `TimeOfFlightDays`:飞行时间(d),已验证为到达与出发时刻的精确天数差。
64
64
  - `ArrivalLightAngle`:到达时刻太阳光照角(deg),已验证为 `DeltaV2` 与 `RV2` 位置矢量的夹角。
65
+ - `MinRangeAu`/`MaxRangeAu`:从出发到到达的转移弧上,距太阳的最小/最大距离(AU,包含端点)。
65
66
 
66
67
  ## 小行星与显式 MPC 根数
67
68
 
@@ -63,6 +63,7 @@ Each result object contains:
63
63
  - `RV1`/`RV2`: heliocentric position and velocity at departure/arrival `[x, y, z, vx, vy, vz]` (positions m, velocities m/s); under the ICRF branch the transfer velocities agree with the independent Lambert solution, and the endpoint position directions match the ICRF axes.
64
64
  - `TimeOfFlightDays`: time of flight (d), verified to be the exact day difference between the arrival and departure times.
65
65
  - `ArrivalLightAngle`: Sun lighting angle at arrival (deg), verified to be the angle between `DeltaV2` and the `RV2` position vector.
66
+ - `MinRangeAu`/`MaxRangeAu`: minimum/maximum distance from the Sun along the departure-to-arrival transfer arc (AU, including endpoints).
66
67
 
67
68
  ## Asteroids and explicit MPC elements
68
69
 
@@ -280,6 +280,7 @@ The response contains `TransferResults` (an array of transfer results; each elem
280
280
  | `RV1` / `RV2` | number[6] | Position and velocity at departure/arrival (heliocentric) `[x, y, z, vx, vy, vz]`, positions m, velocities m/s |
281
281
  | `TimeOfFlightDays` | number | Time of flight, in d; verified to be the exact day difference between `ArrivalTime` and `DepartureTime` |
282
282
  | `ArrivalLightAngle` | number | Sun lighting angle at arrival, in deg; verified to be the angle between `DeltaV2` and the `RV2` position vector |
283
+ | `MinRangeAu` / `MaxRangeAu` | number | Minimum/maximum distance from the Sun along the departure-to-arrival transfer arc, in AU; includes endpoints, rather than describing the full orbit's perihelion/aphelion distances |
283
284
 
284
285
  Verified (supported by independent cross-validation): omitting `sun_frame` produces exactly the same `TransferResults` as explicit `EclpJ2000ICRF`; `EclpJ2000ICRF` output is the `ICRF` output rotated by the fixed 23.43929111111111° J2000 mean obliquity; with `sun_frame="ICRF"`, the transfer velocities in `RV1`/`RV2` follow the zero-revolution prograde Lambert relationship, and the endpoint position directions use the ICRF axes; `max_departure_delta_v_m_s`/`max_arrival_delta_v_m_s`/`max_time_of_flight_days` filter the sampled grid by the `DV1_Mag`/`DV2_Mag`/time-of-flight upper bounds respectively. Note that since 2026-08-20 the server defaults (10000 m/s each for departure/arrival, 500 d) filter out cases beyond the defaults, so scans over large-ΔV windows need explicitly widened bounds. Unresolved: the exact coordinate relationship between explicit `MeanEclpJ2000` and ICRF, the physical meaning of `DeltaV` relative to the endpoint-body velocities, and independent Kepler propagation of explicit MPC elements (the `reference_frame` option does not change the arrival states of that route; the element convention is still unconfirmed). The numeric semantics of those branches remain unverified, so check them before use.
285
286
 
@@ -280,6 +280,7 @@ print(
280
280
  | `RV1` / `RV2` | number[6] | 出发/到达时的位置速度(日心系)`[x, y, z, vx, vy, vz]`,位置 m、速度 m/s |
281
281
  | `TimeOfFlightDays` | number | 飞行时间,单位 d;已验证为 `ArrivalTime` 与 `DepartureTime` 的精确天数差 |
282
282
  | `ArrivalLightAngle` | number | 到达时刻太阳光照角,单位 deg;已验证为 `DeltaV2` 与 `RV2` 位置矢量的夹角 |
283
+ | `MinRangeAu` / `MaxRangeAu` | number | 从出发到到达的转移弧上,距太阳的最小/最大距离,单位 AU;包含端点,不是整条轨道的近日点/远日点距离 |
283
284
 
284
285
  已验证(独立交叉验证支持):省略 `sun_frame` 与显式传入 `EclpJ2000ICRF` 的 `TransferResults` 完全一致;`EclpJ2000ICRF` 输出是 `ICRF` 输出按 23.43929111111111° J2000 平黄赤交角进行的固定旋转;`sun_frame="ICRF"` 时,`RV1`/`RV2` 中的转移速度遵循零圈顺行 Lambert 关系,端点位置方向使用 ICRF 轴;`max_departure_delta_v_m_s`/`max_arrival_delta_v_m_s`/`max_time_of_flight_days` 分别按 `DV1_Mag`/`DV2_Mag`/飞行时间上限过滤采样网格。注意 2026-08-20 起服务端缺省值(出发/到达各 10000 m/s、500 d)会过滤掉超出缺省的算例,扫描大 ΔV 窗口时需显式放宽。未解决:显式 `MeanEclpJ2000` 与 ICRF 之间的精确坐标关系、`DeltaV` 相对端点天体速度的物理含义、显式 MPC 根数的独立开普勒递推(`reference_frame` 选项不改变该路由的到达状态,元素约定仍未确认)。这些分支的数值语义尚未验证,使用前请自行核对。
285
286
 
@@ -43,9 +43,10 @@ Status of `celestial.mpc_ephemeris`: structure, `target_elements`, `reference_fr
43
43
 
44
44
  ## Lambert transfer windows
45
45
 
46
- Status of `celestial.lambert_transfer_window`: `partial` — the server-default frame, the `EclpJ2000ICRF`↔`ICRF` coordinate relation, the ICRF transfer-state relation for the maintained Earth→Mars grid, the ICRF axis identification of the `RV1`/`RV2` endpoint position directions, the `MinTofDays`/`MaxTofDays`/`MaxDepartureDV`/`MaxArrivalDV` filtering behavior, the DV-magnitude norm invariant, and the `TimeOfFlightDays`/`ArrivalLightAngle` field invariants are `verified`; the explicit `MeanEclpJ2000`↔`ICRF` coordinate relation, the physical endpoint-body-velocity interpretation of `DeltaV`, and the independent Kepler semantics of explicit MPC elements are `unresolved`.
46
+ Status of `celestial.lambert_transfer_window`: `partial` — the server-default frame, the `EclpJ2000ICRF`↔`ICRF` coordinate relation, the ICRF transfer-state relation for the maintained Earth→Mars grid, the ICRF axis identification of the `RV1`/`RV2` endpoint position directions, the `MinTofDays`/`MaxTofDays`/`MaxDepartureDV`/`MaxArrivalDV` filtering behavior, the DV-magnitude norm invariant, the `MinRangeAu`/`MaxRangeAu` finite-arc extrema, and the `TimeOfFlightDays`/`ArrivalLightAngle` field invariants are `verified`; the explicit `MeanEclpJ2000`↔`ICRF` coordinate relation, the physical endpoint-body-velocity interpretation of `DeltaV`, and the independent Kepler semantics of explicit MPC elements are `unresolved`.
47
47
 
48
48
  - ICRF Earth→Mars zero-revolution prograde transfer states: `verified` through [`tests/validation/cross_validation/celestial/test_lambert_transfer_lamberthub.py`](../../tests/validation/cross_validation/celestial/test_lambert_transfer_lamberthub.py). The maintained case compares the complete six UTC departure/arrival timestamp pairs in a 2 departure days × 3 arrival days grid; the independent solver is `lamberthub.izzo2015` with the Sun gravitational parameter (`1.3271244004193938e20 m^3/s^2`), `M=0`, `prograde=True`, and `low_path=True` (a zero-revolution prograde Lambert solution), using the ASTROX `RV1`/`RV2` endpoint positions as its inputs. The ASTROX transfer velocities match the solver within `SOLVER_ABS_TOL_M_S = 1e-6` m/s. The endpoint positions themselves are the solver inputs; their full celestial-state meaning beyond the independently checked directions is not promoted here.
49
+ - Transfer-arc `MinRangeAu`/`MaxRangeAu`: `verified` using independent `lamberthub.izzo2015` velocities and SciPy DOP853 two-body integration with radial-stationary events and both endpoints. The 22 maintained transfers cover Earth→Mars in ICRF and EclpJ2000ICRF, explicit-element asteroid transfers in ICRF, and 2/4/12/14-day ICRF transfers. They exercise 40 interior and 4 endpoint extrema, distinguishing finite-arc bounds from full-orbit apsides. Maximum observed residual is 1.46e-11 AU, below the pre-set 1e-9 AU bound (the 1e-6 m/s Lambert velocity precision budget accumulated over roughly 300 days is about 2e-10 AU; the remaining margin allows propagation amplification and integration error). Integration uses AU/day units, rtol=2e-12 and atol=2e-14, and independently checks arrival-position closure within 1e-9 AU. This comparison conditions on returned endpoint positions; it does not validate the endpoint ephemerides or resolve the explicit MPC-element convention. SciPy is an existing development dependency.
49
50
  - ICRF endpoint position-direction axis identification: `verified` through [`tests/validation/cross_validation/celestial/test_lambert_transfer_lamberthub.py`](../../tests/validation/cross_validation/celestial/test_lambert_transfer_lamberthub.py). For each of the six maintained Earth→Mars results, the `RV1`/`RV2` position directions at the returned UTC departure/arrival epochs are compared with independent Skyfield DE421 heliocentric Earth/Mars position directions (body-minus-Sun positions at the same epochs). The direct angular-separation maximum is approximately 8.54e-7 deg, within the pre-set `ICRF_AXIS_IDENTIFICATION_MAX_ANGLE_DEG = 0.01`; the best of the fixed ±23.43929111111111 deg obliquity rotations applied to the independent directions stays at approximately 22.35 deg maximum separation, above `WRONG_FRAME_MIN_SEPARATION_DEG = 1.0`. This verifies only the identification of the ICRF axes for the endpoint position directions — not full numerical-kernel precision, and not the celestial-state meaning of the endpoint positions beyond their direction. The explicit `MeanEclpJ2000`↔`ICRF` coordinate relation, the `DeltaV` physical interpretation, and the explicit MPC-element semantics remain separate `unresolved` items.
50
51
  - Server-default frame: `verified` on the maintained Earth→Mars grid by exact `TransferResults` equality between omitted `sun_frame` and explicit `sun_frame="EclpJ2000ICRF"`. The default result is distinguishable from explicit `MeanEclpJ2000`, with a current maximum state-vector separation of about 54 km.
51
52
  - `EclpJ2000ICRF`↔`ICRF` coordinate relation: `verified` on every `RV1`, `RV2`, `DeltaV1`, and `DeltaV2` vector in the maintained grid. A fixed 23.43929111111111° J2000 mean-obliquity rotation reproduces the ecliptic output from the independently anchored ICRF output within `ECLIPTIC_RELATION_POSITION_ABS_TOL_M = 1e-3 m` and `ECLIPTIC_RELATION_VELOCITY_ABS_TOL_M_S = 1e-9 m/s`; current maximum residuals are approximately 3.1e-5 m and 1.1e-11 m/s.
@@ -61,7 +62,7 @@ Status of `celestial.lambert_transfer_window`: `partial` — the server-default
61
62
 
62
63
  ## Live snapshot coverage
63
64
 
64
- The celestial functions are exercised in [`tests/validation/live_snapshot/celestial/test_celestial.py`](../../tests/validation/live_snapshot/celestial/test_celestial.py), with sidecar [`tests/validation/live_snapshot/celestial/celestial.snap.json`](../../tests/validation/live_snapshot/celestial/celestial.snap.json) covering `ephemeris` (Moon, explicit window), `cb_axes_rotation` (order 0 and 1), `mpc_ephemeris` (Apophis, server-owned default window), and `lambert_transfer_window` (Earth→Mars with the server-default `EclpJ2000ICRF` frame, and Earth→2015 XF261 with explicit MPC elements and `sun_frame="ICRF"`). The snapshots freeze recursive nested type/layout descriptors: per-field value kinds, the CZML `cartesianVelocity` 7-value grouping, the order-dependent `Rotation` lengths (4 for `order=0`, 7 for `order=1`), the MPC `OrbitElements` key set (including `ReferenceFrame` since 2026-08-20), and the transfer-result grid with its `DeltaV` 3-vector and `RV` 6-vector layouts plus the `TimeOfFlightDays`/`ArrivalLightAngle` numbers (since 2026-08-20); volatile numeric values are not frozen, and the MPC numeric values remain catalog-data-owned. Curated returns remove the transport status wrapper fields `IsSuccess`/`Message`, so the frozen shapes contain only server data fields. These live snapshots are drift detectors for the response shape of maintained public inputs.
65
+ The celestial functions are exercised in [`tests/validation/live_snapshot/celestial/test_celestial.py`](../../tests/validation/live_snapshot/celestial/test_celestial.py), with sidecar [`tests/validation/live_snapshot/celestial/celestial.snap.json`](../../tests/validation/live_snapshot/celestial/celestial.snap.json) covering `ephemeris` (Moon, explicit window), `cb_axes_rotation` (order 0 and 1), `mpc_ephemeris` (Apophis, server-owned default window), and `lambert_transfer_window` (Earth→Mars with the server-default `EclpJ2000ICRF` frame, and Earth→2015 XF261 with explicit MPC elements and `sun_frame="ICRF"`). The snapshots freeze recursive nested type/layout descriptors: per-field value kinds, the CZML `cartesianVelocity` 7-value grouping, the order-dependent `Rotation` lengths (4 for `order=0`, 7 for `order=1`), the MPC `OrbitElements` key set (including `ReferenceFrame` since 2026-08-20), and the transfer-result grid with its `DeltaV` 3-vector and `RV` 6-vector layouts plus the `TimeOfFlightDays`/`ArrivalLightAngle` numbers (since 2026-08-20); the two range fields added in the 2026-09-19 upstream contract are also retained as numeric AU values with a 1e-9 AU absolute comparison tolerance; other volatile numeric values are not frozen, and the MPC numeric values remain catalog-data-owned. Curated returns remove the transport status wrapper fields `IsSuccess`/`Message`, so the frozen shapes contain only server data fields. These live snapshots detect drift in response shape and the retained range values for maintained public inputs.
65
66
 
66
67
  Cross-validation scripts:
67
68
  - [`tests/validation/cross_validation/celestial/test_ephemeris_skyfield.py`](../../tests/validation/cross_validation/celestial/test_ephemeris_skyfield.py)
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "astrox-python"
7
- version = "1.2.1"
7
+ version = "1.2.2"
8
8
  description = "Python SDK for the ASTROX Web API."
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -59,7 +59,7 @@ dev = [
59
59
  "astropy>=6.1.7",
60
60
  "spiceypy>=8.1.2",
61
61
  "scipy>=1.14",
62
- "e2m2e==5.9.4",
62
+ "e2m2e==5.9.5",
63
63
  ]
64
64
 
65
65
  [tool.hatch.build.targets.wheel]
@@ -451,7 +451,13 @@ def test_lambert_transfer_window_lowers_complete_payload_and_strips_status(
451
451
  transfer_response = {
452
452
  "IsSuccess": True,
453
453
  "Message": "Success",
454
- "TransferResults": [{"RV1": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]}],
454
+ "TransferResults": [
455
+ {
456
+ "RV1": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0],
457
+ "MinRangeAu": 0.8,
458
+ "MaxRangeAu": 1.6,
459
+ }
460
+ ],
455
461
  "FutureField": {"preserve": True},
456
462
  }
457
463
  calls = record_raw_post(monkeypatch, transfer_response)
@@ -472,7 +478,13 @@ def test_lambert_transfer_window_lowers_complete_payload_and_strips_status(
472
478
  )
473
479
 
474
480
  assert response == {
475
- "TransferResults": [{"RV1": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]}],
481
+ "TransferResults": [
482
+ {
483
+ "RV1": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0],
484
+ "MinRangeAu": 0.8,
485
+ "MaxRangeAu": 1.6,
486
+ }
487
+ ],
476
488
  "FutureField": {"preserve": True},
477
489
  }
478
490
  assert response is not transfer_response
@@ -29,6 +29,10 @@ server's element convention is identified.
29
29
  # and DepartureTime
30
30
  # - ArrivalLightAngle: verified as the angle in degrees between DeltaV2 and
31
31
  # the RV2 position vector
32
+ # - MinRangeAu/MaxRangeAu: verified against independent Lambert velocities
33
+ # and DOP853 radial-stationary events plus endpoints for ICRF/EclpJ2000ICRF
34
+ # Earth -> Mars, explicit-element asteroid ICRF, and short ICRF transfers;
35
+ # conditional on returned endpoint positions, not their ephemeris model
32
36
  # - DeltaV1/DeltaV2 physical body-velocity interpretation: unresolved
33
37
  # Parameters:
34
38
  # - departure and arrival sampling: verified for two departure dates and
@@ -71,6 +75,7 @@ import numpy as np
71
75
  import pytest
72
76
  from astropy.time import Time
73
77
  from lamberthub import izzo2015
78
+ from scipy.integrate import solve_ivp
74
79
 
75
80
  REPO_ROOT = Path(__file__).resolve().parents[4]
76
81
  if str(REPO_ROOT) not in sys.path:
@@ -88,6 +93,7 @@ SUN_MU_M3_S2 = 1.3271244004193938e20
88
93
  AU_M = 149597870700.0
89
94
  MEAN_OBLIQUITY_DEG = 23.43929111111111
90
95
  SOLVER_ABS_TOL_M_S = 1.0e-6
96
+ RANGE_ABS_TOL_AU = 1e-9
91
97
  NORM_REL_TOL = 1.0e-12
92
98
  NORM_ABS_TOL_M_S = 1.0e-9
93
99
  ECLIPTIC_RELATION_POSITION_ABS_TOL_M = 1.0e-3
@@ -306,6 +312,101 @@ def test_transfer_states_match_lamberthub_zero_revolution_prograde() -> None:
306
312
  )
307
313
 
308
314
 
315
+ def test_transfer_ranges_match_independent_arc_extrema() -> None:
316
+ """Check finite transfer arcs, conditioning on the returned endpoint positions."""
317
+ configure_astrox_from_env()
318
+ # Independent Lambert velocities seed DOP853 two-body integration in AU/day.
319
+ # A 1e-6 m/s solver precision budget over ~300 days gives ~2e-10 AU;
320
+ # 1e-9 AU allows propagation amplification and integration error (rtol 2e-12).
321
+ # Endpoint ephemerides and explicit MPC element conventions are not tested here.
322
+ mu = SUN_MU_M3_S2 * 86400.0**2 / AU_M**3
323
+ max_residual = 0.0
324
+ interior_extrema = 0
325
+ endpoint_extrema = 0
326
+ grids = [
327
+ (
328
+ f"{frame}, explicit_elements={explicit_elements}",
329
+ _astrox_transfer_results(frame=frame, explicit_elements=explicit_elements),
330
+ )
331
+ for frame, explicit_elements in (
332
+ ("ICRF", False),
333
+ ("EclpJ2000ICRF", False),
334
+ ("ICRF", True),
335
+ )
336
+ ]
337
+ grids.append(
338
+ (
339
+ "ICRF short window",
340
+ _require_results(_short_window_results(min_tof_days=1), expected_count=4),
341
+ )
342
+ )
343
+ for label, results in grids:
344
+ for result in results:
345
+ r1, _ = _state(result, "RV1")
346
+ r2, _ = _state(result, "RV2")
347
+ tof_s = (
348
+ _time(result["ArrivalTime"]) - _time(result["DepartureTime"])
349
+ ).total_seconds()
350
+ v1, _ = izzo2015(
351
+ SUN_MU_M3_S2, r1, r2, tof_s, M=0, prograde=True, low_path=True
352
+ )
353
+ initial = np.concatenate((r1 / AU_M, v1 * 86400.0 / AU_M))
354
+ duration = tof_s / 86400.0
355
+
356
+ def derivative(t: float, state: np.ndarray) -> np.ndarray:
357
+ r = state[:3]
358
+ return np.concatenate((state[3:], -mu * r / np.linalg.norm(r) ** 3))
359
+
360
+ def radial_stationary(t: float, state: np.ndarray) -> float:
361
+ return float(np.dot(state[:3], state[3:]))
362
+
363
+ solution = solve_ivp(
364
+ derivative,
365
+ (0.0, duration),
366
+ initial,
367
+ method="DOP853",
368
+ rtol=2e-12,
369
+ atol=2e-14,
370
+ max_step=duration / 64,
371
+ events=radial_stationary,
372
+ )
373
+ if not solution.success:
374
+ raise CrossValidationError(solution.message)
375
+ endpoint_error = float(np.linalg.norm(solution.y[:3, -1] - r2 / AU_M))
376
+ if endpoint_error > RANGE_ABS_TOL_AU:
377
+ raise CrossValidationError(
378
+ f"Independent transfer endpoint residual={endpoint_error} AU"
379
+ )
380
+ radii = [
381
+ float(np.linalg.norm(initial[:3])),
382
+ float(np.linalg.norm(solution.y[:3, -1])),
383
+ ]
384
+ radii.extend(
385
+ float(np.linalg.norm(state[:3])) for state in solution.y_events[0]
386
+ )
387
+ for key, index in (
388
+ ("MinRangeAu", int(np.argmin(radii))),
389
+ ("MaxRangeAu", int(np.argmax(radii))),
390
+ ):
391
+ actual = _require_number(result[key], field=key)
392
+ residual = abs(actual - radii[index])
393
+ max_residual = max(max_residual, residual)
394
+ if index < 2:
395
+ endpoint_extrema += 1
396
+ else:
397
+ interior_extrema += 1
398
+ if not math.isfinite(actual) or residual > RANGE_ABS_TOL_AU:
399
+ raise CrossValidationError(
400
+ f"{label}: {key}={actual}, independent={radii[index]}, residual={residual} AU"
401
+ )
402
+ # These fixtures must distinguish finite-arc bounds from full-orbit apsides.
403
+ assert interior_extrema > 0
404
+ assert endpoint_extrema > 0
405
+ print(f"LAMBERT_RANGE_MAX_RESIDUAL_AU={max_residual:.12g}")
406
+ print(f"LAMBERT_RANGE_INTERIOR_EXTREMA={interior_extrema}")
407
+ print(f"LAMBERT_RANGE_ENDPOINT_EXTREMA={endpoint_extrema}")
408
+
409
+
309
410
  def test_transfer_delta_v_magnitudes_match_vector_norms() -> None:
310
411
  configure_astrox_from_env()
311
412
  results = _astrox_transfer_results(frame="ICRF", explicit_elements=False)
@@ -940,6 +1041,7 @@ def test_explicit_mpc_elements_match_independent_kepler_propagation() -> None:
940
1041
  def main() -> int:
941
1042
  try:
942
1043
  test_transfer_states_match_lamberthub_zero_revolution_prograde()
1044
+ test_transfer_ranges_match_independent_arc_extrema()
943
1045
  test_transfer_delta_v_magnitudes_match_vector_norms()
944
1046
  test_min_time_of_flight_filters_short_sampling_pairs()
945
1047
  test_time_of_flight_days_matches_timestamp_delta()
@@ -951,7 +1053,7 @@ def main() -> int:
951
1053
  except Exception as exc:
952
1054
  print(f"CROSS_VALIDATION_FAILED={type(exc).__name__}: {exc}", file=sys.stderr)
953
1055
  return 1
954
- print("CROSS_VALIDATION_CHECKED=9")
1056
+ print("CROSS_VALIDATION_CHECKED=10")
955
1057
  print("CROSS_VALIDATION_FAILED=0")
956
1058
  return 0
957
1059
 
@@ -195,6 +195,12 @@
195
195
  "DepartureTime": {
196
196
  "kind": "string"
197
197
  },
198
+ "MaxRangeAu": {
199
+ "kind": "number"
200
+ },
201
+ "MinRangeAu": {
202
+ "kind": "number"
203
+ },
198
204
  "RV1": {
199
205
  "item": {
200
206
  "kind": "number"
@@ -220,7 +226,33 @@
220
226
  }
221
227
  },
222
228
  "kind": "object"
223
- }
229
+ },
230
+ "transfer_ranges_au": [
231
+ {
232
+ "MaxRangeAu": 1.6583036266502333,
233
+ "MinRangeAu": 0.5810318537519513
234
+ },
235
+ {
236
+ "MaxRangeAu": 1.6590932311459603,
237
+ "MinRangeAu": 0.5799496237129426
238
+ },
239
+ {
240
+ "MaxRangeAu": 1.6599357782012405,
241
+ "MinRangeAu": 0.5788355442344318
242
+ },
243
+ {
244
+ "MaxRangeAu": 1.654301440655211,
245
+ "MinRangeAu": 0.5908207427768893
246
+ },
247
+ {
248
+ "MaxRangeAu": 1.6549025168843594,
249
+ "MinRangeAu": 0.5898559754259631
250
+ },
251
+ {
252
+ "MaxRangeAu": 1.6555556342710411,
253
+ "MinRangeAu": 0.5888611049770791
254
+ }
255
+ ]
224
256
  }
225
257
  },
226
258
  {
@@ -261,6 +293,12 @@
261
293
  "DepartureTime": {
262
294
  "kind": "string"
263
295
  },
296
+ "MaxRangeAu": {
297
+ "kind": "number"
298
+ },
299
+ "MinRangeAu": {
300
+ "kind": "number"
301
+ },
264
302
  "RV1": {
265
303
  "item": {
266
304
  "kind": "number"
@@ -286,12 +324,38 @@
286
324
  }
287
325
  },
288
326
  "kind": "object"
289
- }
327
+ },
328
+ "transfer_ranges_au": [
329
+ {
330
+ "MaxRangeAu": 1.1046815597850406,
331
+ "MinRangeAu": 0.9433212640311289
332
+ },
333
+ {
334
+ "MaxRangeAu": 1.1000967105904083,
335
+ "MinRangeAu": 0.9469611101758767
336
+ },
337
+ {
338
+ "MaxRangeAu": 1.0954139108010212,
339
+ "MinRangeAu": 0.950705771186044
340
+ },
341
+ {
342
+ "MaxRangeAu": 1.1033355644754934,
343
+ "MinRangeAu": 0.9453675951733505
344
+ },
345
+ {
346
+ "MaxRangeAu": 1.0987601689577309,
347
+ "MinRangeAu": 0.9489508608039481
348
+ },
349
+ {
350
+ "MaxRangeAu": 1.0940920723610155,
351
+ "MinRangeAu": 0.9526341172739136
352
+ }
353
+ ]
290
354
  }
291
355
  }
292
356
  ],
293
357
  "metadata": {
294
358
  "astrox_base_url": "http://astrox.cn:8765",
295
- "refreshed_at": "2026-08-24T06:28:12Z"
359
+ "refreshed_at": "2026-09-21T05:23:56Z"
296
360
  }
297
361
  }
@@ -23,6 +23,8 @@ from tests.validation._support import ( # noqa: E402
23
23
 
24
24
 
25
25
  SNAPSHOT_PATH = Path(__file__).with_name("celestial.snap.json")
26
+ # Range values use the independently validated transfer-arc precision bound.
27
+ RANGE_ABS_TOL_AU = 1e-9
26
28
  START = "2026-01-01T00:00:00.000Z"
27
29
  STOP = "2026-01-02T00:00:00.000Z"
28
30
 
@@ -149,6 +151,8 @@ def _transfer_result_shape(value: Any, *, field: str) -> dict[str, Any]:
149
151
  "RV2",
150
152
  "TimeOfFlightDays",
151
153
  "ArrivalLightAngle",
154
+ "MinRangeAu",
155
+ "MaxRangeAu",
152
156
  )
153
157
  for key in required:
154
158
  if key not in value:
@@ -156,10 +160,22 @@ def _transfer_result_shape(value: Any, *, field: str) -> dict[str, Any]:
156
160
  for key in ("DepartureTime", "ArrivalTime"):
157
161
  if not isinstance(value[key], str):
158
162
  raise SnapshotError(f"{field}.{key} must be a string")
159
- for key in ("DV1_Mag", "DV2_Mag", "TimeOfFlightDays", "ArrivalLightAngle"):
163
+ for key in (
164
+ "DV1_Mag",
165
+ "DV2_Mag",
166
+ "TimeOfFlightDays",
167
+ "ArrivalLightAngle",
168
+ "MinRangeAu",
169
+ "MaxRangeAu",
170
+ ):
160
171
  if not isinstance(value[key], int | float) or isinstance(value[key], bool):
161
172
  raise SnapshotError(f"{field}.{key} must be numeric")
162
- for key, expected_length in (("DeltaV1", 3), ("DeltaV2", 3), ("RV1", 6), ("RV2", 6)):
173
+ for key, expected_length in (
174
+ ("DeltaV1", 3),
175
+ ("DeltaV2", 3),
176
+ ("RV1", 6),
177
+ ("RV2", 6),
178
+ ):
163
179
  series = value[key]
164
180
  if (
165
181
  not isinstance(series, list)
@@ -234,7 +250,12 @@ def transfer_shape(*, frame: str | None, explicit_elements: bool) -> dict[str, A
234
250
  item_fields[key]["length"] = expected_length
235
251
  for index, result in enumerate(results):
236
252
  _transfer_result_shape(result, field=f"TransferResults[{index}]")
237
- return _response_snapshot(shape)
253
+ snapshot = _response_snapshot(shape)
254
+ snapshot["transfer_ranges_au"] = [
255
+ {key: result[key] for key in ("MinRangeAu", "MaxRangeAu")}
256
+ for result in results
257
+ ]
258
+ return snapshot
238
259
 
239
260
 
240
261
  CASES = [
@@ -273,12 +294,12 @@ CASES = [
273
294
 
274
295
  def test_celestial_live_snapshot() -> None:
275
296
  configure_astrox_from_env()
276
- check_snapshot(cases=CASES, snapshot_path=SNAPSHOT_PATH)
297
+ check_snapshot(cases=CASES, snapshot_path=SNAPSHOT_PATH, abs_tol=RANGE_ABS_TOL_AU)
277
298
 
278
299
 
279
300
  def _main() -> int:
280
301
  try:
281
- return snapshot_main(cases=CASES, snapshot_path=SNAPSHOT_PATH)
302
+ return snapshot_main(cases=CASES, snapshot_path=SNAPSHOT_PATH, abs_tol=RANGE_ABS_TOL_AU)
282
303
  except Exception as exc:
283
304
  print(f"LIVE_SNAPSHOT_FAILED={type(exc).__name__}: {exc}", file=sys.stderr)
284
305
  return 1
@@ -109,7 +109,7 @@ wheels = [
109
109
 
110
110
  [[package]]
111
111
  name = "astrox-python"
112
- version = "1.2.1"
112
+ version = "1.2.2"
113
113
  source = { editable = "." }
114
114
  dependencies = [
115
115
  { name = "requests" },
@@ -142,7 +142,7 @@ requires-dist = [{ name = "requests", specifier = ">=2.34.2" }]
142
142
  dev = [
143
143
  { name = "astropy", specifier = ">=6.1.7" },
144
144
  { name = "brahe", specifier = ">=1.6.0" },
145
- { name = "e2m2e", specifier = "==5.9.4" },
145
+ { name = "e2m2e", specifier = "==5.9.5" },
146
146
  { name = "geographiclib", specifier = ">=2.1" },
147
147
  { name = "hatchling", specifier = ">=1.30.1" },
148
148
  { name = "lamberthub", specifier = ">=1.0.0" },
@@ -527,7 +527,7 @@ wheels = [
527
527
 
528
528
  [[package]]
529
529
  name = "e2m2e"
530
- version = "5.9.4"
530
+ version = "5.9.5"
531
531
  source = { registry = "https://pypi.org/simple" }
532
532
  dependencies = [
533
533
  { name = "calcephpy" },
@@ -540,11 +540,11 @@ dependencies = [
540
540
  { name = "spiceypy" },
541
541
  { name = "tqdm" },
542
542
  ]
543
- sdist = { url = "https://files.pythonhosted.org/packages/86/84/72d8019c0d97c030a718ac4e535c4eaa936c29c50e7ce7680eb44c2cb4f5/e2m2e-5.9.4.tar.gz", hash = "sha256:56a29916e5677b9d8e8cd8501913a0794a03cd36080aaab2dee34b1a361131a1", size = 5887698, upload-time = "2026-09-04T09:58:55.746Z" }
543
+ sdist = { url = "https://files.pythonhosted.org/packages/85/12/470edadcaf7cfe7c5dab177b28205070089819b09414c53f823a98b56002/e2m2e-5.9.5.tar.gz", hash = "sha256:1d6ff9508d79aa9417e60dcd75086388a5788a367b8f89bfa193c0f972f385a9", size = 5888222, upload-time = "2026-09-07T06:12:55.248Z" }
544
544
  wheels = [
545
- { url = "https://files.pythonhosted.org/packages/ea/e9/01d094f1e8c4ce11f7d161055f44c205bca7ee39779f07ea35d1725a8515/e2m2e-5.9.4-cp310-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:1dc6a9845219ed50d168c40596071ed984bbe5e457518ac4f62b9aff68aef9b4", size = 8047422, upload-time = "2026-09-04T09:58:49.133Z" },
546
- { url = "https://files.pythonhosted.org/packages/83/7d/801c034c73f92599bbed9fb5fd6483badf24779876ca5c15491d1c2d1619/e2m2e-5.9.4-cp310-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:7a4cd2d63039633fea2d0414f2efdbbcd056f29b577907790785ed63ec06007b", size = 8193466, upload-time = "2026-09-04T09:58:51.54Z" },
547
- { url = "https://files.pythonhosted.org/packages/6f/e6/a0e9f7cae75bfe66552b36da869d83e4e0c307316a1177ca782d4c009dda/e2m2e-5.9.4-cp310-abi3-win_amd64.whl", hash = "sha256:7d23059dfb8004a4ee4df5a705bea222975a06bc0ce8ecd1d868825be12bf9bc", size = 7884876, upload-time = "2026-09-04T09:58:53.73Z" },
545
+ { url = "https://files.pythonhosted.org/packages/3c/fa/f006140a838ca92fca7c370e3f9e821e675eb637fbd358ea5842d44b77df/e2m2e-5.9.5-cp310-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e1254122d927eca64fa9e2323622009472c8f27dbbbfc2fbeda59ed0c458f560", size = 8047398, upload-time = "2026-09-07T06:12:47.606Z" },
546
+ { url = "https://files.pythonhosted.org/packages/85/4b/4fad55148ecefbb04f32dbb4b1666804ee4da4c12854e1540ccfa8d5c694/e2m2e-5.9.5-cp310-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:52bfa9a8a90c03484170db8a22f2533abdc7e56fe7249a51d83d060720051964", size = 8189609, upload-time = "2026-09-07T06:12:50.82Z" },
547
+ { url = "https://files.pythonhosted.org/packages/df/f6/598c443d393b2b12ec34e0d592f9459fd2ea57f81fe6416dc93e3380131f/e2m2e-5.9.5-cp310-abi3-win_amd64.whl", hash = "sha256:68fd24c5142d816724fc3e99dd1bef4334dc7d038c1758fb0eef0dc78f327197", size = 7884931, upload-time = "2026-09-07T06:12:53.105Z" },
548
548
  ]
549
549
 
550
550
  [[package]]
File without changes
File without changes
File without changes