astrox-python 0.2.0__tar.gz → 1.1.0__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 (358) hide show
  1. {astrox_python-0.2.0 → astrox_python-1.1.0}/.gitignore +1 -0
  2. {astrox_python-0.2.0 → astrox_python-1.1.0}/PKG-INFO +3 -3
  3. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/__init__.py +3 -1
  4. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/catalog.py +22 -3
  5. astrox_python-1.1.0/astrox/celestial.py +406 -0
  6. astrox_python-1.1.0/astrox/libration.py +448 -0
  7. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/orbits.py +38 -6
  8. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/propagator.py +31 -0
  9. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/terrain.py +14 -1
  10. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/how_to/README.md +2 -0
  11. astrox_python-1.1.0/docs/how_to/compute_lambert_transfer.md +100 -0
  12. astrox_python-1.1.0/docs/how_to/generate_a_crtbp_periodic_orbit.md +113 -0
  13. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/how_to/propagate_an_orbit.md +3 -1
  14. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/i18n/en/how_to/README.md +2 -0
  15. astrox_python-1.1.0/docs/i18n/en/how_to/compute_lambert_transfer.md +101 -0
  16. astrox_python-1.1.0/docs/i18n/en/how_to/generate_a_crtbp_periodic_orbit.md +113 -0
  17. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/i18n/en/how_to/propagate_an_orbit.md +3 -1
  18. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/i18n/en/manual/README.md +1 -0
  19. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/i18n/en/manual/catalog/README.md +4 -4
  20. astrox_python-1.1.0/docs/i18n/en/manual/celestial/README.md +300 -0
  21. astrox_python-1.1.0/docs/i18n/en/manual/libration/README.md +306 -0
  22. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/i18n/en/manual/orbits/README.md +18 -2
  23. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/i18n/en/manual/propagator/README.md +40 -1
  24. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/i18n/en/manual/terrain/README.md +3 -3
  25. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/manual/README.md +1 -0
  26. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/manual/catalog/README.md +4 -4
  27. astrox_python-1.1.0/docs/manual/celestial/README.md +300 -0
  28. astrox_python-1.1.0/docs/manual/libration/README.md +306 -0
  29. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/manual/orbits/README.md +18 -2
  30. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/manual/propagator/README.md +40 -1
  31. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/manual/terrain/README.md +3 -3
  32. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/validation/README.md +1 -0
  33. astrox_python-1.1.0/docs/validation/celestial.md +65 -0
  34. astrox_python-1.1.0/docs/validation/libration.md +66 -0
  35. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/validation/orbits.md +5 -3
  36. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/validation/propagator.md +26 -0
  37. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/01_propagation/README.md +3 -1
  38. astrox_python-1.1.0/examples/01_propagation/two_body_rv.py +38 -0
  39. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/02_orbits/lambert_delta_v.py +14 -0
  40. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/10_catalog/catalog_queries.py +3 -6
  41. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/11_celestial/README.md +4 -2
  42. astrox_python-1.1.0/examples/11_celestial/celestial_queries.py +81 -0
  43. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/12_terrain/terrain_masks.py +2 -2
  44. astrox_python-1.1.0/examples/13_libration/README.md +20 -0
  45. astrox_python-1.1.0/examples/13_libration/libration_dynamics.py +60 -0
  46. {astrox_python-0.2.0 → astrox_python-1.1.0}/pyproject.toml +4 -2
  47. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/catalog/test_catalog.py +8 -3
  48. astrox_python-1.1.0/tests/sdk/celestial/test_celestial.py +601 -0
  49. astrox_python-1.1.0/tests/sdk/libration/test_libration.py +522 -0
  50. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/orbits/test_conversions.py +95 -4
  51. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/propagator/test_public_contract.py +1 -0
  52. astrox_python-1.1.0/tests/sdk/propagator/test_two_body_rv.py +138 -0
  53. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/terrain/test_terrain.py +3 -2
  54. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/_support/__init__.py +2 -0
  55. astrox_python-1.1.0/tests/validation/_support/orekit.py +68 -0
  56. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/celestial/test_cb_axes_rotation_invariants.py +2 -3
  57. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/celestial/test_ephemeris_skyfield.py +0 -4
  58. astrox_python-1.1.0/tests/validation/cross_validation/celestial/test_lambert_transfer_lamberthub.py +852 -0
  59. astrox_python-1.1.0/tests/validation/cross_validation/celestial/test_mpc_target_elements.py +170 -0
  60. astrox_python-1.1.0/tests/validation/cross_validation/libration/_support.py +382 -0
  61. astrox_python-1.1.0/tests/validation/cross_validation/libration/test_cross_endpoint_consistency.py +187 -0
  62. astrox_python-1.1.0/tests/validation/cross_validation/libration/test_crtbp_trajectory.py +250 -0
  63. astrox_python-1.1.0/tests/validation/cross_validation/libration/test_e2m2e_qualification.py +491 -0
  64. astrox_python-1.1.0/tests/validation/cross_validation/libration/test_fixed_x_correction.py +219 -0
  65. astrox_python-1.1.0/tests/validation/cross_validation/libration/test_orekit_qualification.py +373 -0
  66. astrox_python-1.1.0/tests/validation/cross_validation/libration/test_periodic_families.py +301 -0
  67. astrox_python-1.1.0/tests/validation/cross_validation/libration/test_positions_and_units.py +204 -0
  68. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/lighting/test_spacecraft_solar_intensity_orekit.py +5 -24
  69. astrox_python-1.1.0/tests/validation/cross_validation/orbits/test_lambert_path_points.py +172 -0
  70. astrox_python-1.1.0/tests/validation/cross_validation/propagator/test_two_body_rv_brahe.py +228 -0
  71. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/terrain/test_terrain_mask_invariants.py +3 -8
  72. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/astrogator/test_run_mcs.py +5 -2
  73. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/catalog/catalog.snap.json +1 -25
  74. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/catalog/test_catalog.py +3 -14
  75. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/celestial/celestial.snap.json +136 -33
  76. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/celestial/test_celestial.py +124 -27
  77. astrox_python-1.1.0/tests/validation/live_snapshot/libration/libration.snap.json +2546 -0
  78. astrox_python-1.1.0/tests/validation/live_snapshot/libration/test_libration.py +328 -0
  79. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/orbits/conversions.snap.json +28 -1
  80. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/orbits/test_conversions.py +16 -0
  81. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/propagator/test_two_body.py +22 -1
  82. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/propagator/two_body.snap.json +32 -1
  83. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/terrain/terrain.snap.json +1 -17
  84. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/terrain/test_terrain.py +2 -12
  85. {astrox_python-0.2.0 → astrox_python-1.1.0}/uv.lock +294 -22
  86. astrox_python-0.2.0/astrox/celestial.py +0 -153
  87. astrox_python-0.2.0/docs/i18n/en/manual/celestial/README.md +0 -149
  88. astrox_python-0.2.0/docs/manual/celestial/README.md +0 -149
  89. astrox_python-0.2.0/docs/validation/celestial.md +0 -45
  90. astrox_python-0.2.0/examples/11_celestial/celestial_queries.py +0 -42
  91. astrox_python-0.2.0/tests/sdk/celestial/test_celestial.py +0 -266
  92. {astrox_python-0.2.0 → astrox_python-1.1.0}/LICENSE +0 -0
  93. {astrox_python-0.2.0 → astrox_python-1.1.0}/README.md +0 -0
  94. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/_http.py +0 -0
  95. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/access.py +0 -0
  96. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/astrogator/__init__.py +0 -0
  97. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/astrogator/_api.py +0 -0
  98. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/astrogator/_models.py +0 -0
  99. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/astrogator/_results.py +0 -0
  100. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/cat.py +0 -0
  101. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/components/__init__.py +0 -0
  102. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/components/_axes.py +0 -0
  103. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/components/_common.py +0 -0
  104. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/components/_constraints.py +0 -0
  105. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/components/_objects.py +0 -0
  106. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/components/_positions.py +0 -0
  107. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/components/_rotations.py +0 -0
  108. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/components/_sensors.py +0 -0
  109. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/components/_vgt.py +0 -0
  110. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/conjunction.py +0 -0
  111. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/coverage/__init__.py +0 -0
  112. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/coverage/_core.py +0 -0
  113. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/coverage/_fom.py +0 -0
  114. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/coverage/coverage_time.py +0 -0
  115. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/coverage/number_of_assets.py +0 -0
  116. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/coverage/response_time.py +0 -0
  117. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/coverage/revisit_time.py +0 -0
  118. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/coverage/simple_coverage.py +0 -0
  119. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/exceptions.py +0 -0
  120. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/lighting.py +0 -0
  121. {astrox_python-0.2.0 → astrox_python-1.1.0}/astrox/rocket.py +0 -0
  122. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/CONTRIBUTING.md +0 -0
  123. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/README.md +0 -0
  124. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/automated-workflows.md +0 -0
  125. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/docs-principles.md +0 -0
  126. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/getting_started.md +0 -0
  127. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/how_to/build_an_hpop_configuration.md +0 -0
  128. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/how_to/compute_access_intervals.md +0 -0
  129. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/how_to/compute_lighting_conditions.md +0 -0
  130. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/how_to/convert_between_orbit_representations.md +0 -0
  131. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/how_to/run_an_astrogator_mcs.md +0 -0
  132. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/how_to/screen_close_approaches.md +0 -0
  133. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/i18n/en/README.md +0 -0
  134. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/i18n/en/getting_started.md +0 -0
  135. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/i18n/en/how_to/build_an_hpop_configuration.md +0 -0
  136. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/i18n/en/how_to/compute_access_intervals.md +0 -0
  137. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/i18n/en/how_to/compute_lighting_conditions.md +0 -0
  138. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/i18n/en/how_to/convert_between_orbit_representations.md +0 -0
  139. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/i18n/en/how_to/run_an_astrogator_mcs.md +0 -0
  140. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/i18n/en/how_to/screen_close_approaches.md +0 -0
  141. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/i18n/en/manual/access/README.md +0 -0
  142. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/i18n/en/manual/astrogator/README.md +0 -0
  143. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/i18n/en/manual/cat/README.md +0 -0
  144. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/i18n/en/manual/components/README.md +0 -0
  145. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/i18n/en/manual/conjunction/README.md +0 -0
  146. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/i18n/en/manual/coverage/README.md +0 -0
  147. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/i18n/en/manual/lighting/README.md +0 -0
  148. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/i18n/en/manual/rocket/README.md +0 -0
  149. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/manual/access/README.md +0 -0
  150. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/manual/astrogator/README.md +0 -0
  151. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/manual/cat/README.md +0 -0
  152. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/manual/components/README.md +0 -0
  153. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/manual/conjunction/README.md +0 -0
  154. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/manual/coverage/README.md +0 -0
  155. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/manual/lighting/README.md +0 -0
  156. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/manual/rocket/README.md +0 -0
  157. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/sdk-principles.md +0 -0
  158. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/test-principles.md +0 -0
  159. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/validation/access.md +0 -0
  160. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/validation/astrogator.md +0 -0
  161. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/validation/cat.md +0 -0
  162. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/validation/catalog.md +0 -0
  163. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/validation/conjunction.md +0 -0
  164. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/validation/coverage.md +0 -0
  165. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/validation/lighting.md +0 -0
  166. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/validation/rocket.md +0 -0
  167. {astrox_python-0.2.0 → astrox_python-1.1.0}/docs/validation/terrain.md +0 -0
  168. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/01_propagation/ballistic_apogee_alt.py +0 -0
  169. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/01_propagation/ballistic_delta_v.py +0 -0
  170. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/01_propagation/ballistic_min_ecc.py +0 -0
  171. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/01_propagation/ballistic_time_of_flight.py +0 -0
  172. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/01_propagation/batch_propagators.py +0 -0
  173. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/01_propagation/hpop.py +0 -0
  174. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/01_propagation/j2_classical.py +0 -0
  175. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/01_propagation/propagator_reference.py +0 -0
  176. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/01_propagation/sgp4_tle.py +0 -0
  177. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/01_propagation/simple_ascent.py +0 -0
  178. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/01_propagation/two_body_classical.py +0 -0
  179. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/02_orbits/README.md +0 -0
  180. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/02_orbits/conversions.py +0 -0
  181. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/02_orbits/orbit_system.py +0 -0
  182. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/02_orbits/wizards.py +0 -0
  183. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/03_lighting/README.md +0 -0
  184. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/03_lighting/lighting.py +0 -0
  185. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/04_access/README.md +0 -0
  186. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/04_access/chain.py +0 -0
  187. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/04_access/compute.py +0 -0
  188. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/04_access/constraints.py +0 -0
  189. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/04_access/custom_axes.py +0 -0
  190. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/04_access/sensor_pointing.py +0 -0
  191. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/05_rocket/README.md +0 -0
  192. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/05_rocket/landing_zone.py +0 -0
  193. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/06_coverage/README.md +0 -0
  194. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/06_coverage/compute.py +0 -0
  195. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/06_coverage/fom.py +0 -0
  196. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/06_coverage/grid_points.py +0 -0
  197. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/06_coverage/reports.py +0 -0
  198. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/07_astrogator/run_mcs.py +0 -0
  199. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/08_conjunction/README.md +0 -0
  200. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/08_conjunction/close_approaches.py +0 -0
  201. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/09_cat/README.md +0 -0
  202. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/09_cat/cat_workflows.py +0 -0
  203. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/10_catalog/README.md +0 -0
  204. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/12_terrain/README.md +0 -0
  205. {astrox_python-0.2.0 → astrox_python-1.1.0}/examples/manifest.toml +0 -0
  206. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/README.md +0 -0
  207. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/conftest.py +0 -0
  208. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/access/helpers.py +0 -0
  209. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/access/test_chain.py +0 -0
  210. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/access/test_compute.py +0 -0
  211. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/access/test_values.py +0 -0
  212. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/astrogator/test_api.py +0 -0
  213. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/astrogator/test_models.py +0 -0
  214. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/astrogator/test_results.py +0 -0
  215. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/cat/test_cat.py +0 -0
  216. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/client/test_client.py +0 -0
  217. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/components/test_components.py +0 -0
  218. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/conjunction/test_conjunction.py +0 -0
  219. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/coverage/test_coverage.py +0 -0
  220. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/coverage/test_coverage_fom.py +0 -0
  221. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/helpers.py +0 -0
  222. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/lighting/test_lighting.py +0 -0
  223. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/orbits/helpers.py +0 -0
  224. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/orbits/test_keplerian.py +0 -0
  225. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/orbits/test_orbit_system.py +0 -0
  226. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/orbits/test_tle.py +0 -0
  227. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/orbits/test_wizards.py +0 -0
  228. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/propagator/helpers.py +0 -0
  229. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/propagator/test_ballistic.py +0 -0
  230. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/propagator/test_hpop.py +0 -0
  231. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/propagator/test_j2_two_body.py +0 -0
  232. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/propagator/test_multi.py +0 -0
  233. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/propagator/test_sgp4_simple_ascent.py +0 -0
  234. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/rocket/__init__.py +0 -0
  235. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/sdk/rocket/test_rocket.py +0 -0
  236. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/README.md +0 -0
  237. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/_external/gmat/README.md +0 -0
  238. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/_external/gmat/hpop_driver.py +0 -0
  239. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/_external/gmat/test_hpop_driver.py +0 -0
  240. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/_support/contracts.py +0 -0
  241. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/_support/external_tools.py +0 -0
  242. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/_support/gmat.py +0 -0
  243. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/_support/skyfield.py +0 -0
  244. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/_support/test_contracts.py +0 -0
  245. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/_support/test_external_tools.py +0 -0
  246. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/_support/test_gmat.py +0 -0
  247. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/_support/test_skyfield.py +0 -0
  248. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/__init__.py +0 -0
  249. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/access/README.md +0 -0
  250. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/access/__init__.py +0 -0
  251. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/access/_aer.py +0 -0
  252. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/access/_cases.py +0 -0
  253. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/access/_constraints.py +0 -0
  254. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/access/_exclusion.py +0 -0
  255. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/access/_geometry.py +0 -0
  256. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/access/_mixed_model.py +0 -0
  257. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/access/_orientation.py +0 -0
  258. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/access/test_axes_orientation_geometry.py +0 -0
  259. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/access/test_chain_sgp4_skyfield.py +0 -0
  260. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/access/test_composite_czml_axes_geometry.py +0 -0
  261. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/access/test_compute_constraints_skyfield.py +0 -0
  262. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/access/test_compute_exclusion_constraints_invariants.py +0 -0
  263. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/access/test_compute_ground_sgp4_skyfield.py +0 -0
  264. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/access/test_compute_j2_two_body_geometry.py +0 -0
  265. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/access/test_compute_sgp4_j2_geometry.py +0 -0
  266. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/access/test_compute_site_hpop_geometry.py +0 -0
  267. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/access/test_compute_site_j2_geometry.py +0 -0
  268. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/access/test_compute_site_two_body_geometry.py +0 -0
  269. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/access/test_sensor_pointing_geometry.py +0 -0
  270. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/access/test_vgt_orientation_resolution.py +0 -0
  271. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/astrogator/__init__.py +0 -0
  272. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/astrogator/test_branch_semantics.py +0 -0
  273. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/astrogator/test_initial_state_conversions.py +0 -0
  274. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/astrogator/test_maneuver_invariants.py +0 -0
  275. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/astrogator/test_run_mcs_two_body_brahe.py +0 -0
  276. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/astrogator/test_scalar_invariants.py +0 -0
  277. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/astrogator/test_sequence_czml_brahe.py +0 -0
  278. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/astrogator/test_target_sequence_local.py +0 -0
  279. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/cat/test_cat_skyfield.py +0 -0
  280. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/conjunction/test_close_approaches_skyfield.py +0 -0
  281. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/coverage/_fom_helpers.py +0 -0
  282. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/coverage/test_exclusion_grid_constraints_skyfield.py +0 -0
  283. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/coverage/test_fom_at_time_boundaries_invariants.py +0 -0
  284. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/coverage/test_fom_edge_cases_invariants.py +0 -0
  285. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/coverage/test_fom_grid_options_invariants.py +0 -0
  286. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/coverage/test_fom_interval_invariants.py +0 -0
  287. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/coverage/test_fom_resource_options_invariants.py +0 -0
  288. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/coverage/test_fom_response_shapes_invariants.py +0 -0
  289. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/coverage/test_fom_response_time_dynamic_invariants.py +0 -0
  290. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/coverage/test_grid_generation_local.py +0 -0
  291. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/coverage/test_grid_point_modifiers_invariants.py +0 -0
  292. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/coverage/test_resource_reports_invariants.py +0 -0
  293. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/coverage/test_sgp4_grid_membership_skyfield.py +0 -0
  294. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/lighting/__init__.py +0 -0
  295. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/lighting/test_site_sun_skyfield.py +0 -0
  296. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/lighting/test_spacecraft_sun_skyfield.py +0 -0
  297. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/orbit_system/__init__.py +0 -0
  298. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/orbit_system/_support.py +0 -0
  299. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/orbit_system/test_convert_czml_position.py +0 -0
  300. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/orbit_system/test_earth_moon_libration.py +0 -0
  301. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/orbits/__init__.py +0 -0
  302. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/orbits/test_kozai_izsak_mean_elements_invariants.py +0 -0
  303. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/orbits/test_lambert_lamberthub.py +0 -0
  304. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/orbits/test_walker_constellation_equations.py +0 -0
  305. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/orbits/test_wizards_local_derivation.py +0 -0
  306. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/propagator/test_ballistic_geodetic.py +0 -0
  307. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/propagator/test_hpop_gmat.py +0 -0
  308. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/propagator/test_j2_analytical.py +0 -0
  309. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/propagator/test_multi_sgp4_skyfield.py +0 -0
  310. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/propagator/test_sgp4_skyfield.py +0 -0
  311. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/propagator/test_simple_ascent_geodetic.py +0 -0
  312. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/propagator/test_two_body_brahe.py +0 -0
  313. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/rocket/__init__.py +0 -0
  314. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/cross_validation/rocket/test_landing_zone_geographiclib.py +0 -0
  315. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/__init__.py +0 -0
  316. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/access/__init__.py +0 -0
  317. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/access/access.snap.json +0 -0
  318. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/access/test_access.py +0 -0
  319. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/access/test_chain_topology.py +0 -0
  320. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/access/test_compute_model_pairs.py +0 -0
  321. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/access/test_compute_options.py +0 -0
  322. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/astrogator/__init__.py +0 -0
  323. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/astrogator/run_mcs.snap.json +0 -0
  324. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/cat/cat.snap.json +0 -0
  325. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/cat/test_cat.py +0 -0
  326. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/conjunction/close_approaches.snap.json +0 -0
  327. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/conjunction/test_close_approaches.py +0 -0
  328. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/coverage/coverage.snap.json +0 -0
  329. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/coverage/test_coverage.py +0 -0
  330. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/lighting/__init__.py +0 -0
  331. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/lighting/lighting.snap.json +0 -0
  332. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/lighting/test_lighting.py +0 -0
  333. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/orbits/__init__.py +0 -0
  334. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/orbits/orbit_system.snap.json +0 -0
  335. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/orbits/test_conversion_roundtrip.py +0 -0
  336. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/orbits/test_orbit_system.py +0 -0
  337. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/orbits/test_wizards.py +0 -0
  338. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/orbits/wizards.snap.json +0 -0
  339. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/propagator/__init__.py +0 -0
  340. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/propagator/ballistic.snap.json +0 -0
  341. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/propagator/hpop.snap.json +0 -0
  342. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/propagator/j2.snap.json +0 -0
  343. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/propagator/multi_j2.snap.json +0 -0
  344. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/propagator/multi_sgp4.snap.json +0 -0
  345. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/propagator/multi_two_body.snap.json +0 -0
  346. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/propagator/sgp4.snap.json +0 -0
  347. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/propagator/simple_ascent.snap.json +0 -0
  348. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/propagator/test_ballistic.py +0 -0
  349. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/propagator/test_hpop.py +0 -0
  350. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/propagator/test_j2.py +0 -0
  351. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/propagator/test_multi_j2.py +0 -0
  352. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/propagator/test_multi_sgp4.py +0 -0
  353. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/propagator/test_multi_two_body.py +0 -0
  354. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/propagator/test_sgp4.py +0 -0
  355. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/propagator/test_simple_ascent.py +0 -0
  356. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/rocket/__init__.py +0 -0
  357. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/rocket/landing_zone.snap.json +0 -0
  358. {astrox_python-0.2.0 → astrox_python-1.1.0}/tests/validation/live_snapshot/rocket/test_landing_zone.py +0 -0
@@ -14,6 +14,7 @@ wheels/
14
14
  # Internal & intermediate docs
15
15
  *.md
16
16
  !README.md
17
+ !AGENTS.md
17
18
  !docs/**/*.md
18
19
  docs/MAINTAINER_QUESTIONS.md
19
20
  !openapi/**/*.md
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: astrox-python
3
- Version: 0.2.0
3
+ Version: 1.1.0
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
@@ -10,7 +10,7 @@ Author-email: Mtrya <erchanmion20@outlook.com>
10
10
  License-Expression: MIT
11
11
  License-File: LICENSE
12
12
  Keywords: astrodynamics,astrox,orbit,propagation,sdk,space
13
- Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Development Status :: 5 - Production/Stable
14
14
  Classifier: Intended Audience :: Developers
15
15
  Classifier: Intended Audience :: Science/Research
16
16
  Classifier: License :: OSI Approved :: MIT License
@@ -4,7 +4,7 @@ Functions are organized by domain modules and can use package-level
4
4
  configuration without requiring explicit client management:
5
5
 
6
6
  import astrox
7
- from astrox import access, celestial, catalog, components, coverage, lighting, orbits, propagator, terrain
7
+ from astrox import access, celestial, catalog, components, coverage, libration, lighting, orbits, propagator, terrain
8
8
 
9
9
  astrox.configure(base_url="http://custom:8765", timeout=120)
10
10
  orbit = orbits.keplerian(...)
@@ -35,6 +35,7 @@ from astrox import (
35
35
  conjunction,
36
36
  components,
37
37
  coverage,
38
+ libration,
38
39
  lighting,
39
40
  orbits,
40
41
  propagator,
@@ -60,6 +61,7 @@ __all__ = [
60
61
  "conjunction",
61
62
  "coverage",
62
63
  "components",
64
+ "libration",
63
65
  "lighting",
64
66
  "orbits",
65
67
  "propagator",
@@ -43,6 +43,16 @@ def _optional_boolean_query(value: bool | None, *, parameter: str) -> str | None
43
43
  return "true" if value else "false"
44
44
 
45
45
 
46
+ def _without_status_fields(value: Any, *, endpoint: str) -> dict[str, Any]:
47
+ if not isinstance(value, dict):
48
+ raise TypeError(f"{endpoint} response must be an object")
49
+ return {
50
+ key: item
51
+ for key, item in value.items()
52
+ if key not in {"IsSuccess", "Message"}
53
+ }
54
+
55
+
46
56
  def query_cities(
47
57
  *,
48
58
  city_name: str | None = None,
@@ -72,7 +82,10 @@ def query_cities(
72
82
  "typeOfCity",
73
83
  _optional_string(city_type, parameter="city_type"),
74
84
  )
75
- return raw.get("/city", params=params)
85
+ return _without_status_fields(
86
+ raw.get("/city", params=params),
87
+ endpoint="/city",
88
+ )
76
89
 
77
90
 
78
91
  def query_facilities(
@@ -92,7 +105,10 @@ def query_facilities(
92
105
  "networkName",
93
106
  _optional_string(network_name, parameter="network_name"),
94
107
  )
95
- return raw.get("/facility", params=params)
108
+ return _without_status_fields(
109
+ raw.get("/facility", params=params),
110
+ endpoint="/facility",
111
+ )
96
112
 
97
113
 
98
114
  def query_satellites(
@@ -172,4 +188,7 @@ def query_satellites(
172
188
  parameter="maximum_inclination_deg",
173
189
  ),
174
190
  )
175
- return raw.get("/ssc", params=params)
191
+ return _without_status_fields(
192
+ raw.get("/ssc", params=params),
193
+ endpoint="/ssc",
194
+ )
@@ -0,0 +1,406 @@
1
+ """Celestial read-like and computational endpoint functions."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import dataclass
6
+ from numbers import Real
7
+ from typing import Any
8
+
9
+ from astrox._http import raw
10
+
11
+ __all__ = [
12
+ "MpcOrbitalElements",
13
+ "cb_axes_rotation",
14
+ "ephemeris",
15
+ "lambert_transfer_window",
16
+ "mpc_ephemeris",
17
+ "mpc_orbital_elements",
18
+ ]
19
+
20
+
21
+ def _include_if_supplied(payload: dict[str, Any], wire_key: str, value: Any) -> None:
22
+ if value is not None:
23
+ payload[wire_key] = value
24
+
25
+
26
+ def _string(value: str, *, parameter: str) -> str:
27
+ if not isinstance(value, str):
28
+ raise TypeError(f"{parameter} must be a string")
29
+ return value
30
+
31
+
32
+ def _optional_string(value: str | None, *, parameter: str) -> str | None:
33
+ if value is None:
34
+ return None
35
+ return _string(value, parameter=parameter)
36
+
37
+
38
+ def _optional_number(value: float | None, *, parameter: str) -> float | None:
39
+ if value is None:
40
+ return None
41
+ if isinstance(value, bool) or not isinstance(value, Real):
42
+ raise TypeError(f"{parameter} must be a number")
43
+ return float(value)
44
+
45
+
46
+ def _optional_integer(value: int | None, *, parameter: str) -> int | None:
47
+ if value is None:
48
+ return None
49
+ if isinstance(value, bool) or not isinstance(value, int):
50
+ raise TypeError(f"{parameter} must be an integer")
51
+ return value
52
+
53
+
54
+ def _without_status_fields(value: Any, *, endpoint: str) -> dict[str, Any]:
55
+ if not isinstance(value, dict):
56
+ raise TypeError(f"{endpoint} response must be an object")
57
+ return {
58
+ key: item
59
+ for key, item in value.items()
60
+ if key not in {"IsSuccess", "Message"}
61
+ }
62
+
63
+
64
+ @dataclass(frozen=True, kw_only=True)
65
+ class MpcOrbitalElements:
66
+ """MPC heliocentric orbital elements used by celestial transfer routes."""
67
+
68
+ epoch_mjd_tdt: float | None = None
69
+ periapsis_time_mjd_tdt: float | None = None
70
+ periapsis_distance_au: float | None = None
71
+ semi_major_axis_au: float | None = None
72
+ eccentricity: float | None = None
73
+ inclination_deg: float | None = None
74
+ raan_deg: float | None = None
75
+ argument_of_periapsis_deg: float | None = None
76
+ mean_anomaly_deg: float | None = None
77
+ reference_frame: str | None = None
78
+ """Heliocentric mean-ecliptic variant: ``MeanEclpJ2000`` (JPL) or
79
+ ``EclpJ2000ICRF`` (MPC, server default)."""
80
+
81
+ def __post_init__(self) -> None:
82
+ for field_name in (
83
+ "epoch_mjd_tdt",
84
+ "periapsis_time_mjd_tdt",
85
+ "periapsis_distance_au",
86
+ "semi_major_axis_au",
87
+ "eccentricity",
88
+ "inclination_deg",
89
+ "raan_deg",
90
+ "argument_of_periapsis_deg",
91
+ "mean_anomaly_deg",
92
+ ):
93
+ object.__setattr__(
94
+ self,
95
+ field_name,
96
+ _optional_number(
97
+ getattr(self, field_name),
98
+ parameter=field_name,
99
+ ),
100
+ )
101
+ object.__setattr__(
102
+ self,
103
+ "reference_frame",
104
+ _optional_string(self.reference_frame, parameter="reference_frame"),
105
+ )
106
+
107
+ def to_wire(self) -> dict[str, Any]:
108
+ payload: dict[str, Any] = {}
109
+ _include_if_supplied(payload, "EpochMjdTdt", self.epoch_mjd_tdt)
110
+ _include_if_supplied(payload, "PeriTimeMjdTdt", self.periapsis_time_mjd_tdt)
111
+ _include_if_supplied(payload, "Q", self.periapsis_distance_au)
112
+ _include_if_supplied(payload, "SemimajorAxis", self.semi_major_axis_au)
113
+ _include_if_supplied(payload, "Eccentricity", self.eccentricity)
114
+ _include_if_supplied(payload, "Inclination", self.inclination_deg)
115
+ _include_if_supplied(payload, "Raan", self.raan_deg)
116
+ _include_if_supplied(
117
+ payload,
118
+ "ArgOfPeriapsis",
119
+ self.argument_of_periapsis_deg,
120
+ )
121
+ _include_if_supplied(payload, "MeanAnomaly", self.mean_anomaly_deg)
122
+ _include_if_supplied(payload, "ReferenceFrame", self.reference_frame)
123
+ return payload
124
+
125
+
126
+ def mpc_orbital_elements(
127
+ *,
128
+ epoch_mjd_tdt: float | None = None,
129
+ periapsis_time_mjd_tdt: float | None = None,
130
+ periapsis_distance_au: float | None = None,
131
+ semi_major_axis_au: float | None = None,
132
+ eccentricity: float | None = None,
133
+ inclination_deg: float | None = None,
134
+ raan_deg: float | None = None,
135
+ argument_of_periapsis_deg: float | None = None,
136
+ mean_anomaly_deg: float | None = None,
137
+ reference_frame: str | None = None,
138
+ ) -> MpcOrbitalElements:
139
+ """Build an MPC orbital-element fragment without adding physics policy."""
140
+ return MpcOrbitalElements(
141
+ epoch_mjd_tdt=epoch_mjd_tdt,
142
+ periapsis_time_mjd_tdt=periapsis_time_mjd_tdt,
143
+ periapsis_distance_au=periapsis_distance_au,
144
+ semi_major_axis_au=semi_major_axis_au,
145
+ eccentricity=eccentricity,
146
+ inclination_deg=inclination_deg,
147
+ raan_deg=raan_deg,
148
+ argument_of_periapsis_deg=argument_of_periapsis_deg,
149
+ mean_anomaly_deg=mean_anomaly_deg,
150
+ reference_frame=reference_frame,
151
+ )
152
+
153
+
154
+ def _interval(start: str, stop: str, *, parameter: str) -> str:
155
+ return "/".join(
156
+ (
157
+ _string(start, parameter=f"{parameter}_start"),
158
+ _string(stop, parameter=f"{parameter}_stop"),
159
+ )
160
+ )
161
+
162
+
163
+ def _elements_to_wire(
164
+ value: MpcOrbitalElements | None,
165
+ *,
166
+ parameter: str,
167
+ ) -> dict[str, Any] | None:
168
+ if value is None:
169
+ return None
170
+ if not isinstance(value, MpcOrbitalElements):
171
+ raise TypeError(f"{parameter} must be an MpcOrbitalElements value")
172
+ return value.to_wire()
173
+
174
+
175
+ def lambert_transfer_window(
176
+ *,
177
+ departure_body: str,
178
+ arrival_body: str,
179
+ departure_start: str,
180
+ departure_stop: str,
181
+ arrival_start: str,
182
+ arrival_stop: str,
183
+ sun_frame: str | None = None,
184
+ min_time_of_flight_days: int | None = None,
185
+ departure_step_days: float | None = None,
186
+ arrival_step_days: float | None = None,
187
+ departure_elements: MpcOrbitalElements | None = None,
188
+ arrival_elements: MpcOrbitalElements | None = None,
189
+ max_departure_delta_v_m_s: int | None = None,
190
+ max_arrival_delta_v_m_s: int | None = None,
191
+ max_time_of_flight_days: int | None = None,
192
+ ) -> dict[str, Any]:
193
+ """Return a Lambert transfer-window scan from ASTROX.
194
+
195
+ The returned dictionary preserves every server field except the transport
196
+ success envelope fields ``IsSuccess`` and ``Message``. The transfer route
197
+ itself returns one result for each sampled departure/arrival time pair that
198
+ it evaluates; it is not the single-case ``orbits.lambert_delta_v`` route.
199
+ """
200
+ payload: dict[str, Any] = {
201
+ "DepartureCbName": _string(departure_body, parameter="departure_body"),
202
+ "ArrivalCbName": _string(arrival_body, parameter="arrival_body"),
203
+ "DepartureInterval": _interval(
204
+ departure_start,
205
+ departure_stop,
206
+ parameter="departure_interval",
207
+ ),
208
+ "ArrivalInterval": _interval(
209
+ arrival_start,
210
+ arrival_stop,
211
+ parameter="arrival_interval",
212
+ ),
213
+ }
214
+ _include_if_supplied(
215
+ payload,
216
+ "SunFrameName",
217
+ _optional_string(sun_frame, parameter="sun_frame"),
218
+ )
219
+ _include_if_supplied(
220
+ payload,
221
+ "MinTofDays",
222
+ _optional_integer(
223
+ min_time_of_flight_days,
224
+ parameter="min_time_of_flight_days",
225
+ ),
226
+ )
227
+ _include_if_supplied(
228
+ payload,
229
+ "DepartureStepDay",
230
+ _optional_number(
231
+ departure_step_days,
232
+ parameter="departure_step_days",
233
+ ),
234
+ )
235
+ _include_if_supplied(
236
+ payload,
237
+ "ArrivalStepDay",
238
+ _optional_number(
239
+ arrival_step_days,
240
+ parameter="arrival_step_days",
241
+ ),
242
+ )
243
+ _include_if_supplied(
244
+ payload,
245
+ "DepartureElements",
246
+ _elements_to_wire(departure_elements, parameter="departure_elements"),
247
+ )
248
+ _include_if_supplied(
249
+ payload,
250
+ "ArrivalElements",
251
+ _elements_to_wire(arrival_elements, parameter="arrival_elements"),
252
+ )
253
+ _include_if_supplied(
254
+ payload,
255
+ "MaxDepartureDV",
256
+ _optional_integer(
257
+ max_departure_delta_v_m_s,
258
+ parameter="max_departure_delta_v_m_s",
259
+ ),
260
+ )
261
+ _include_if_supplied(
262
+ payload,
263
+ "MaxArrivalDV",
264
+ _optional_integer(
265
+ max_arrival_delta_v_m_s,
266
+ parameter="max_arrival_delta_v_m_s",
267
+ ),
268
+ )
269
+ _include_if_supplied(
270
+ payload,
271
+ "MaxTofDays",
272
+ _optional_integer(
273
+ max_time_of_flight_days,
274
+ parameter="max_time_of_flight_days",
275
+ ),
276
+ )
277
+ return _without_status_fields(
278
+ raw.post("/celestial/transfer", json=payload),
279
+ endpoint="/celestial/transfer",
280
+ )
281
+
282
+
283
+ def ephemeris(
284
+ *,
285
+ target_name: str,
286
+ start: str | None = None,
287
+ stop: str | None = None,
288
+ observer_name: str | None = None,
289
+ observer_frame: str | None = None,
290
+ step_s: float | None = None,
291
+ ) -> dict[str, Any]:
292
+ """Return ASTROX ephemeris output for a target and optional time window."""
293
+ payload: dict[str, Any] = {
294
+ "TargetName": _string(target_name, parameter="target_name"),
295
+ }
296
+ _include_if_supplied(
297
+ payload,
298
+ "Start",
299
+ _optional_string(start, parameter="start"),
300
+ )
301
+ _include_if_supplied(
302
+ payload,
303
+ "Stop",
304
+ _optional_string(stop, parameter="stop"),
305
+ )
306
+ _include_if_supplied(
307
+ payload,
308
+ "ObserverName",
309
+ _optional_string(observer_name, parameter="observer_name"),
310
+ )
311
+ _include_if_supplied(
312
+ payload,
313
+ "ObserverFrame",
314
+ _optional_string(observer_frame, parameter="observer_frame"),
315
+ )
316
+ _include_if_supplied(
317
+ payload,
318
+ "Step",
319
+ _optional_number(step_s, parameter="step_s"),
320
+ )
321
+ return _without_status_fields(
322
+ raw.post("/celestial/ephemeris", json=payload),
323
+ endpoint="/celestial/ephemeris",
324
+ )
325
+
326
+
327
+ def cb_axes_rotation(
328
+ *,
329
+ from_central_body: str,
330
+ to_central_body: str,
331
+ epoch: str,
332
+ from_frame: str | None = None,
333
+ to_frame: str | None = None,
334
+ order: int | None = None,
335
+ ) -> dict[str, Any]:
336
+ """Return ASTROX axes-rotation output between two central-body frames."""
337
+ payload: dict[str, Any] = {
338
+ "FromCbName": _string(
339
+ from_central_body,
340
+ parameter="from_central_body",
341
+ ),
342
+ "ToCbName": _string(to_central_body, parameter="to_central_body"),
343
+ "Epoch": _string(epoch, parameter="epoch"),
344
+ }
345
+ _include_if_supplied(
346
+ payload,
347
+ "FromCbFrame",
348
+ _optional_string(from_frame, parameter="from_frame"),
349
+ )
350
+ _include_if_supplied(
351
+ payload,
352
+ "ToCbFrame",
353
+ _optional_string(to_frame, parameter="to_frame"),
354
+ )
355
+ _include_if_supplied(
356
+ payload,
357
+ "Order",
358
+ _optional_integer(order, parameter="order"),
359
+ )
360
+ return _without_status_fields(
361
+ raw.post("/celestial/CbAxesRotation", json=payload),
362
+ endpoint="/celestial/CbAxesRotation",
363
+ )
364
+
365
+
366
+ def mpc_ephemeris(
367
+ *,
368
+ target_name: str,
369
+ observer_frame: str | None = None,
370
+ start: str | None = None,
371
+ stop: str | None = None,
372
+ target_elements: MpcOrbitalElements | None = None,
373
+ ) -> dict[str, Any]:
374
+ """Return ASTROX minor-planet ephemeris output from its MPC-backed route.
375
+
376
+ When ``target_elements`` is supplied, the server integrates those MPC
377
+ orbital elements directly instead of resolving ``target_name`` through the
378
+ MPC network query.
379
+ """
380
+ payload: dict[str, Any] = {
381
+ "TargetName": _string(target_name, parameter="target_name"),
382
+ }
383
+ _include_if_supplied(
384
+ payload,
385
+ "ObserverFrame",
386
+ _optional_string(observer_frame, parameter="observer_frame"),
387
+ )
388
+ _include_if_supplied(
389
+ payload,
390
+ "Start",
391
+ _optional_string(start, parameter="start"),
392
+ )
393
+ _include_if_supplied(
394
+ payload,
395
+ "Stop",
396
+ _optional_string(stop, parameter="stop"),
397
+ )
398
+ _include_if_supplied(
399
+ payload,
400
+ "TargetElements",
401
+ _elements_to_wire(target_elements, parameter="target_elements"),
402
+ )
403
+ return _without_status_fields(
404
+ raw.post("/celestial/mpc", json=payload),
405
+ endpoint="/celestial/mpc",
406
+ )