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