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.
- {astrox_python-0.2.0 → astrox_python-1.0.0}/PKG-INFO +3 -3
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/__init__.py +3 -1
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/catalog.py +22 -3
- astrox_python-1.0.0/astrox/celestial.py +357 -0
- astrox_python-1.0.0/astrox/libration.py +448 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/terrain.py +14 -1
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/how_to/README.md +2 -0
- astrox_python-1.0.0/docs/how_to/compute_lambert_transfer.md +93 -0
- astrox_python-1.0.0/docs/how_to/generate_a_crtbp_periodic_orbit.md +113 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/i18n/en/how_to/README.md +2 -0
- astrox_python-1.0.0/docs/i18n/en/how_to/compute_lambert_transfer.md +93 -0
- astrox_python-1.0.0/docs/i18n/en/how_to/generate_a_crtbp_periodic_orbit.md +113 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/i18n/en/manual/README.md +1 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/i18n/en/manual/catalog/README.md +4 -4
- astrox_python-1.0.0/docs/i18n/en/manual/celestial/README.md +282 -0
- astrox_python-1.0.0/docs/i18n/en/manual/libration/README.md +306 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/i18n/en/manual/terrain/README.md +3 -3
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/manual/README.md +1 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/manual/catalog/README.md +4 -4
- astrox_python-1.0.0/docs/manual/celestial/README.md +282 -0
- astrox_python-1.0.0/docs/manual/libration/README.md +306 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/manual/terrain/README.md +3 -3
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/validation/README.md +1 -0
- astrox_python-1.0.0/docs/validation/celestial.md +59 -0
- astrox_python-1.0.0/docs/validation/libration.md +66 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/10_catalog/catalog_queries.py +3 -6
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/11_celestial/README.md +4 -2
- astrox_python-1.0.0/examples/11_celestial/celestial_queries.py +75 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/12_terrain/terrain_masks.py +2 -2
- astrox_python-1.0.0/examples/13_libration/README.md +20 -0
- astrox_python-1.0.0/examples/13_libration/libration_dynamics.py +60 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/pyproject.toml +4 -2
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/catalog/test_catalog.py +8 -3
- astrox_python-1.0.0/tests/sdk/celestial/test_celestial.py +477 -0
- astrox_python-1.0.0/tests/sdk/libration/test_libration.py +522 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/terrain/test_terrain.py +3 -2
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/_support/__init__.py +2 -0
- astrox_python-1.0.0/tests/validation/_support/orekit.py +68 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/celestial/test_cb_axes_rotation_invariants.py +2 -3
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/celestial/test_ephemeris_skyfield.py +0 -4
- astrox_python-1.0.0/tests/validation/cross_validation/celestial/test_lambert_transfer_lamberthub.py +712 -0
- astrox_python-1.0.0/tests/validation/cross_validation/libration/_support.py +382 -0
- astrox_python-1.0.0/tests/validation/cross_validation/libration/test_cross_endpoint_consistency.py +187 -0
- astrox_python-1.0.0/tests/validation/cross_validation/libration/test_crtbp_trajectory.py +250 -0
- astrox_python-1.0.0/tests/validation/cross_validation/libration/test_e2m2e_qualification.py +491 -0
- astrox_python-1.0.0/tests/validation/cross_validation/libration/test_fixed_x_correction.py +219 -0
- astrox_python-1.0.0/tests/validation/cross_validation/libration/test_orekit_qualification.py +373 -0
- astrox_python-1.0.0/tests/validation/cross_validation/libration/test_periodic_families.py +301 -0
- astrox_python-1.0.0/tests/validation/cross_validation/libration/test_positions_and_units.py +204 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/lighting/test_spacecraft_solar_intensity_orekit.py +5 -24
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/terrain/test_terrain_mask_invariants.py +3 -8
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/astrogator/test_run_mcs.py +5 -2
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/catalog/catalog.snap.json +1 -25
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/catalog/test_catalog.py +3 -14
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/celestial/celestial.snap.json +121 -33
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/celestial/test_celestial.py +116 -27
- astrox_python-1.0.0/tests/validation/live_snapshot/libration/libration.snap.json +2546 -0
- astrox_python-1.0.0/tests/validation/live_snapshot/libration/test_libration.py +328 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/terrain/terrain.snap.json +1 -17
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/terrain/test_terrain.py +2 -12
- {astrox_python-0.2.0 → astrox_python-1.0.0}/uv.lock +265 -4
- astrox_python-0.2.0/astrox/celestial.py +0 -153
- astrox_python-0.2.0/docs/i18n/en/manual/celestial/README.md +0 -149
- astrox_python-0.2.0/docs/manual/celestial/README.md +0 -149
- astrox_python-0.2.0/docs/validation/celestial.md +0 -45
- astrox_python-0.2.0/examples/11_celestial/celestial_queries.py +0 -42
- astrox_python-0.2.0/tests/sdk/celestial/test_celestial.py +0 -266
- {astrox_python-0.2.0 → astrox_python-1.0.0}/.gitignore +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/LICENSE +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/_http.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/access.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/astrogator/__init__.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/astrogator/_api.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/astrogator/_models.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/astrogator/_results.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/cat.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/components/__init__.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/components/_axes.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/components/_common.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/components/_constraints.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/components/_objects.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/components/_positions.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/components/_rotations.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/components/_sensors.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/components/_vgt.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/conjunction.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/coverage/__init__.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/coverage/_core.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/coverage/_fom.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/coverage/coverage_time.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/coverage/number_of_assets.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/coverage/response_time.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/coverage/revisit_time.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/coverage/simple_coverage.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/exceptions.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/lighting.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/orbits.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/propagator.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/astrox/rocket.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/CONTRIBUTING.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/automated-workflows.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/docs-principles.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/getting_started.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/how_to/build_an_hpop_configuration.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/how_to/compute_access_intervals.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/how_to/compute_lighting_conditions.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/how_to/convert_between_orbit_representations.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/how_to/propagate_an_orbit.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/how_to/run_an_astrogator_mcs.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/how_to/screen_close_approaches.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/i18n/en/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/i18n/en/getting_started.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/i18n/en/how_to/build_an_hpop_configuration.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/i18n/en/how_to/compute_access_intervals.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/i18n/en/how_to/compute_lighting_conditions.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/i18n/en/how_to/convert_between_orbit_representations.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/i18n/en/how_to/propagate_an_orbit.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/i18n/en/how_to/run_an_astrogator_mcs.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/i18n/en/how_to/screen_close_approaches.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/i18n/en/manual/access/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/i18n/en/manual/astrogator/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/i18n/en/manual/cat/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/i18n/en/manual/components/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/i18n/en/manual/conjunction/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/i18n/en/manual/coverage/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/i18n/en/manual/lighting/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/i18n/en/manual/orbits/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/i18n/en/manual/propagator/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/i18n/en/manual/rocket/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/manual/access/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/manual/astrogator/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/manual/cat/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/manual/components/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/manual/conjunction/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/manual/coverage/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/manual/lighting/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/manual/orbits/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/manual/propagator/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/manual/rocket/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/sdk-principles.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/test-principles.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/validation/access.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/validation/astrogator.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/validation/cat.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/validation/catalog.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/validation/conjunction.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/validation/coverage.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/validation/lighting.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/validation/orbits.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/validation/propagator.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/validation/rocket.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/docs/validation/terrain.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/01_propagation/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/01_propagation/ballistic_apogee_alt.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/01_propagation/ballistic_delta_v.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/01_propagation/ballistic_min_ecc.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/01_propagation/ballistic_time_of_flight.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/01_propagation/batch_propagators.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/01_propagation/hpop.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/01_propagation/j2_classical.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/01_propagation/propagator_reference.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/01_propagation/sgp4_tle.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/01_propagation/simple_ascent.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/01_propagation/two_body_classical.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/02_orbits/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/02_orbits/conversions.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/02_orbits/lambert_delta_v.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/02_orbits/orbit_system.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/02_orbits/wizards.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/03_lighting/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/03_lighting/lighting.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/04_access/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/04_access/chain.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/04_access/compute.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/04_access/constraints.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/04_access/custom_axes.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/04_access/sensor_pointing.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/05_rocket/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/05_rocket/landing_zone.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/06_coverage/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/06_coverage/compute.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/06_coverage/fom.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/06_coverage/grid_points.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/06_coverage/reports.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/07_astrogator/run_mcs.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/08_conjunction/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/08_conjunction/close_approaches.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/09_cat/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/09_cat/cat_workflows.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/10_catalog/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/12_terrain/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/examples/manifest.toml +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/conftest.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/access/helpers.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/access/test_chain.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/access/test_compute.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/access/test_values.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/astrogator/test_api.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/astrogator/test_models.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/astrogator/test_results.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/cat/test_cat.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/client/test_client.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/components/test_components.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/conjunction/test_conjunction.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/coverage/test_coverage.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/coverage/test_coverage_fom.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/helpers.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/lighting/test_lighting.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/orbits/helpers.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/orbits/test_conversions.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/orbits/test_keplerian.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/orbits/test_orbit_system.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/orbits/test_tle.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/orbits/test_wizards.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/propagator/helpers.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/propagator/test_ballistic.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/propagator/test_hpop.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/propagator/test_j2_two_body.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/propagator/test_multi.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/propagator/test_public_contract.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/propagator/test_sgp4_simple_ascent.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/rocket/__init__.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/sdk/rocket/test_rocket.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/_external/gmat/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/_external/gmat/hpop_driver.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/_external/gmat/test_hpop_driver.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/_support/contracts.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/_support/external_tools.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/_support/gmat.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/_support/skyfield.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/_support/test_contracts.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/_support/test_external_tools.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/_support/test_gmat.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/_support/test_skyfield.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/__init__.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/access/README.md +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/access/__init__.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/access/_aer.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/access/_cases.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/access/_constraints.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/access/_exclusion.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/access/_geometry.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/access/_mixed_model.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/access/_orientation.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/access/test_axes_orientation_geometry.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/access/test_chain_sgp4_skyfield.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/access/test_composite_czml_axes_geometry.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/access/test_compute_constraints_skyfield.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/access/test_compute_exclusion_constraints_invariants.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/access/test_compute_ground_sgp4_skyfield.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/access/test_compute_j2_two_body_geometry.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/access/test_compute_sgp4_j2_geometry.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/access/test_compute_site_hpop_geometry.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/access/test_compute_site_j2_geometry.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/access/test_compute_site_two_body_geometry.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/access/test_sensor_pointing_geometry.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/access/test_vgt_orientation_resolution.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/astrogator/__init__.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/astrogator/test_branch_semantics.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/astrogator/test_initial_state_conversions.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/astrogator/test_maneuver_invariants.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/astrogator/test_run_mcs_two_body_brahe.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/astrogator/test_scalar_invariants.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/astrogator/test_sequence_czml_brahe.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/astrogator/test_target_sequence_local.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/cat/test_cat_skyfield.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/conjunction/test_close_approaches_skyfield.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/coverage/_fom_helpers.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/coverage/test_exclusion_grid_constraints_skyfield.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/coverage/test_fom_at_time_boundaries_invariants.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/coverage/test_fom_edge_cases_invariants.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/coverage/test_fom_grid_options_invariants.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/coverage/test_fom_interval_invariants.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/coverage/test_fom_resource_options_invariants.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/coverage/test_fom_response_shapes_invariants.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/coverage/test_fom_response_time_dynamic_invariants.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/coverage/test_grid_generation_local.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/coverage/test_grid_point_modifiers_invariants.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/coverage/test_resource_reports_invariants.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/coverage/test_sgp4_grid_membership_skyfield.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/lighting/__init__.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/lighting/test_site_sun_skyfield.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/lighting/test_spacecraft_sun_skyfield.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/orbit_system/__init__.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/orbit_system/_support.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/orbit_system/test_convert_czml_position.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/orbit_system/test_earth_moon_libration.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/orbits/__init__.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/orbits/test_kozai_izsak_mean_elements_invariants.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/orbits/test_lambert_lamberthub.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/orbits/test_walker_constellation_equations.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/orbits/test_wizards_local_derivation.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/propagator/test_ballistic_geodetic.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/propagator/test_hpop_gmat.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/propagator/test_j2_analytical.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/propagator/test_multi_sgp4_skyfield.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/propagator/test_sgp4_skyfield.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/propagator/test_simple_ascent_geodetic.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/propagator/test_two_body_brahe.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/rocket/__init__.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/cross_validation/rocket/test_landing_zone_geographiclib.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/__init__.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/access/__init__.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/access/access.snap.json +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/access/test_access.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/access/test_chain_topology.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/access/test_compute_model_pairs.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/access/test_compute_options.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/astrogator/__init__.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/astrogator/run_mcs.snap.json +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/cat/cat.snap.json +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/cat/test_cat.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/conjunction/close_approaches.snap.json +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/conjunction/test_close_approaches.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/coverage/coverage.snap.json +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/coverage/test_coverage.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/lighting/__init__.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/lighting/lighting.snap.json +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/lighting/test_lighting.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/orbits/__init__.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/orbits/conversions.snap.json +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/orbits/orbit_system.snap.json +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/orbits/test_conversion_roundtrip.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/orbits/test_conversions.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/orbits/test_orbit_system.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/orbits/test_wizards.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/orbits/wizards.snap.json +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/propagator/__init__.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/propagator/ballistic.snap.json +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/propagator/hpop.snap.json +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/propagator/j2.snap.json +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/propagator/multi_j2.snap.json +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/propagator/multi_sgp4.snap.json +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/propagator/multi_two_body.snap.json +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/propagator/sgp4.snap.json +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/propagator/simple_ascent.snap.json +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/propagator/test_ballistic.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/propagator/test_hpop.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/propagator/test_j2.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/propagator/test_multi_j2.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/propagator/test_multi_sgp4.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/propagator/test_multi_two_body.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/propagator/test_sgp4.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/propagator/test_simple_ascent.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/propagator/test_two_body.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/propagator/two_body.snap.json +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/rocket/__init__.py +0 -0
- {astrox_python-0.2.0 → astrox_python-1.0.0}/tests/validation/live_snapshot/rocket/landing_zone.snap.json +0 -0
- {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.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: astrox-python
|
|
3
|
-
Version: 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 ::
|
|
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
|
|
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
|
|
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
|
|
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
|
+
)
|