satkit 0.24.2__tar.gz → 0.24.3__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 (166) hide show
  1. {satkit-0.24.2 → satkit-0.24.3}/Cargo.lock +32 -32
  2. {satkit-0.24.2 → satkit-0.24.3}/Cargo.toml +1 -1
  3. {satkit-0.24.2 → satkit-0.24.3}/PKG-INFO +1 -1
  4. {satkit-0.24.2 → satkit-0.24.3}/pyproject.toml +1 -1
  5. {satkit-0.24.2 → satkit-0.24.3}/python/Cargo.toml +1 -1
  6. {satkit-0.24.2 → satkit-0.24.3}/python/satkit/__init__.pyi +1 -0
  7. {satkit-0.24.2 → satkit-0.24.3}/python/satkit/_types.py +2 -1
  8. {satkit-0.24.2 → satkit-0.24.3}/python/satkit/satkit.pyi +79 -17
  9. {satkit-0.24.2 → satkit-0.24.3}/python/satkit.egg-info/PKG-INFO +1 -1
  10. {satkit-0.24.2 → satkit-0.24.3}/python/satkit.egg-info/SOURCES.txt +1 -0
  11. {satkit-0.24.2 → satkit-0.24.3}/python/src/lib.rs +1 -0
  12. {satkit-0.24.2 → satkit-0.24.3}/python/src/pyomm.rs +17 -7
  13. {satkit-0.24.2 → satkit-0.24.3}/python/src/pytle.rs +123 -25
  14. satkit-0.24.3/src/omm/csv.rs +306 -0
  15. {satkit-0.24.2 → satkit-0.24.3}/src/omm/error.rs +8 -2
  16. {satkit-0.24.2 → satkit-0.24.3}/src/omm/mod.rs +14 -5
  17. {satkit-0.24.2 → satkit-0.24.3}/src/tle/mod.rs +26 -2
  18. {satkit-0.24.2 → satkit-0.24.3}/LICENSE-APACHE +0 -0
  19. {satkit-0.24.2 → satkit-0.24.3}/LICENSE-MIT +0 -0
  20. {satkit-0.24.2 → satkit-0.24.3}/MANIFEST.in +0 -0
  21. {satkit-0.24.2 → satkit-0.24.3}/README.md +0 -0
  22. {satkit-0.24.2 → satkit-0.24.3}/THIRDPARTY-DATA.md +0 -0
  23. {satkit-0.24.2 → satkit-0.24.3}/benches/hotpaths.rs +0 -0
  24. {satkit-0.24.2 → satkit-0.24.3}/build.rs +0 -0
  25. {satkit-0.24.2 → satkit-0.24.3}/data/embedded/EGM2008.gfc.gz +0 -0
  26. {satkit-0.24.2 → satkit-0.24.3}/data/embedded/EGM96.gfc.gz +0 -0
  27. {satkit-0.24.2 → satkit-0.24.3}/data/embedded/JGM2.gfc.gz +0 -0
  28. {satkit-0.24.2 → satkit-0.24.3}/data/embedded/JGM3.gfc.gz +0 -0
  29. {satkit-0.24.2 → satkit-0.24.3}/data/embedded/SOURCES.json +0 -0
  30. {satkit-0.24.2 → satkit-0.24.3}/data/embedded/tab5.2a.txt.gz +0 -0
  31. {satkit-0.24.2 → satkit-0.24.3}/data/embedded/tab5.2b.txt.gz +0 -0
  32. {satkit-0.24.2 → satkit-0.24.3}/data/embedded/tab5.2d.txt.gz +0 -0
  33. {satkit-0.24.2 → satkit-0.24.3}/data/manifest.json +0 -0
  34. {satkit-0.24.2 → satkit-0.24.3}/examples/chrono_interop.rs +0 -0
  35. {satkit-0.24.2 → satkit-0.24.3}/examples/ephemeris.rs +0 -0
  36. {satkit-0.24.2 → satkit-0.24.3}/examples/frames.rs +0 -0
  37. {satkit-0.24.2 → satkit-0.24.3}/examples/kepler_lambert.rs +0 -0
  38. {satkit-0.24.2 → satkit-0.24.3}/examples/propagate_leo.rs +0 -0
  39. {satkit-0.24.2 → satkit-0.24.3}/examples/quickstart.rs +0 -0
  40. {satkit-0.24.2 → satkit-0.24.3}/examples/sgp4_tle.rs +0 -0
  41. {satkit-0.24.2 → satkit-0.24.3}/examples/sun_moon.rs +0 -0
  42. {satkit-0.24.2 → satkit-0.24.3}/examples/time_scales.rs +0 -0
  43. {satkit-0.24.2 → satkit-0.24.3}/python/build.rs +0 -0
  44. {satkit-0.24.2 → satkit-0.24.3}/python/satkit/__init__.py +0 -0
  45. {satkit-0.24.2 → satkit-0.24.3}/python/satkit/density.pyi +0 -0
  46. {satkit-0.24.2 → satkit-0.24.3}/python/satkit/frametransform.pyi +0 -0
  47. {satkit-0.24.2 → satkit-0.24.3}/python/satkit/jplephem.pyi +0 -0
  48. {satkit-0.24.2 → satkit-0.24.3}/python/satkit/moon.pyi +0 -0
  49. {satkit-0.24.2 → satkit-0.24.3}/python/satkit/planets.pyi +0 -0
  50. {satkit-0.24.2 → satkit-0.24.3}/python/satkit/py.typed +0 -0
  51. {satkit-0.24.2 → satkit-0.24.3}/python/satkit/spaceweather.pyi +0 -0
  52. {satkit-0.24.2 → satkit-0.24.3}/python/satkit/sun.pyi +0 -0
  53. {satkit-0.24.2 → satkit-0.24.3}/python/satkit/utils.pyi +0 -0
  54. {satkit-0.24.2 → satkit-0.24.3}/python/satkit.egg-info/dependency_links.txt +0 -0
  55. {satkit-0.24.2 → satkit-0.24.3}/python/satkit.egg-info/requires.txt +0 -0
  56. {satkit-0.24.2 → satkit-0.24.3}/python/satkit.egg-info/top_level.txt +0 -0
  57. {satkit-0.24.2 → satkit-0.24.3}/python/src/mod_utils.rs +0 -0
  58. {satkit-0.24.2 → satkit-0.24.3}/python/src/pyconsts.rs +0 -0
  59. {satkit-0.24.2 → satkit-0.24.3}/python/src/pydensity.rs +0 -0
  60. {satkit-0.24.2 → satkit-0.24.3}/python/src/pyduration.rs +0 -0
  61. {satkit-0.24.2 → satkit-0.24.3}/python/src/pyecom.rs +0 -0
  62. {satkit-0.24.2 → satkit-0.24.3}/python/src/pyframes.rs +0 -0
  63. {satkit-0.24.2 → satkit-0.24.3}/python/src/pyframetransform.rs +0 -0
  64. {satkit-0.24.2 → satkit-0.24.3}/python/src/pygravity.rs +0 -0
  65. {satkit-0.24.2 → satkit-0.24.3}/python/src/pyinstant.rs +0 -0
  66. {satkit-0.24.2 → satkit-0.24.3}/python/src/pyitrfcoord.rs +0 -0
  67. {satkit-0.24.2 → satkit-0.24.3}/python/src/pyjplephem.rs +0 -0
  68. {satkit-0.24.2 → satkit-0.24.3}/python/src/pykepler.rs +0 -0
  69. {satkit-0.24.2 → satkit-0.24.3}/python/src/pylambert.rs +0 -0
  70. {satkit-0.24.2 → satkit-0.24.3}/python/src/pylogging.rs +0 -0
  71. {satkit-0.24.2 → satkit-0.24.3}/python/src/pylpephem_moon.rs +0 -0
  72. {satkit-0.24.2 → satkit-0.24.3}/python/src/pylpephem_planets.rs +0 -0
  73. {satkit-0.24.2 → satkit-0.24.3}/python/src/pylpephem_sun.rs +0 -0
  74. {satkit-0.24.2 → satkit-0.24.3}/python/src/pynrlmsise.rs +0 -0
  75. {satkit-0.24.2 → satkit-0.24.3}/python/src/pypropagate.rs +0 -0
  76. {satkit-0.24.2 → satkit-0.24.3}/python/src/pypropresult.rs +0 -0
  77. {satkit-0.24.2 → satkit-0.24.3}/python/src/pypropsettings.rs +0 -0
  78. {satkit-0.24.2 → satkit-0.24.3}/python/src/pyquaternion.rs +0 -0
  79. {satkit-0.24.2 → satkit-0.24.3}/python/src/pysatproperties.rs +0 -0
  80. {satkit-0.24.2 → satkit-0.24.3}/python/src/pysatstate.rs +0 -0
  81. {satkit-0.24.2 → satkit-0.24.3}/python/src/pysgp4.rs +0 -0
  82. {satkit-0.24.2 → satkit-0.24.3}/python/src/pysolarsystem.rs +0 -0
  83. {satkit-0.24.2 → satkit-0.24.3}/python/src/pyspaceweather.rs +0 -0
  84. {satkit-0.24.2 → satkit-0.24.3}/python/src/pythrust.rs +0 -0
  85. {satkit-0.24.2 → satkit-0.24.3}/python/src/pytlefitstatus.rs +0 -0
  86. {satkit-0.24.2 → satkit-0.24.3}/python/src/pyutils.rs +0 -0
  87. {satkit-0.24.2 → satkit-0.24.3}/setup.cfg +0 -0
  88. {satkit-0.24.2 → satkit-0.24.3}/src/consts.rs +0 -0
  89. {satkit-0.24.2 → satkit-0.24.3}/src/earth_orientation_params.rs +0 -0
  90. {satkit-0.24.2 → satkit-0.24.3}/src/earthgravity.rs +0 -0
  91. {satkit-0.24.2 → satkit-0.24.3}/src/error.rs +0 -0
  92. {satkit-0.24.2 → satkit-0.24.3}/src/frames.rs +0 -0
  93. {satkit-0.24.2 → satkit-0.24.3}/src/frametransform/dispatch.rs +0 -0
  94. {satkit-0.24.2 → satkit-0.24.3}/src/frametransform/error.rs +0 -0
  95. {satkit-0.24.2 → satkit-0.24.3}/src/frametransform/ierstable.rs +0 -0
  96. {satkit-0.24.2 → satkit-0.24.3}/src/frametransform/mod.rs +0 -0
  97. {satkit-0.24.2 → satkit-0.24.3}/src/frametransform/qcirs2gcrs.rs +0 -0
  98. {satkit-0.24.2 → satkit-0.24.3}/src/itrfcoord.rs +0 -0
  99. {satkit-0.24.2 → satkit-0.24.3}/src/jplephem.rs +0 -0
  100. {satkit-0.24.2 → satkit-0.24.3}/src/kepler.rs +0 -0
  101. {satkit-0.24.2 → satkit-0.24.3}/src/lambert.rs +0 -0
  102. {satkit-0.24.2 → satkit-0.24.3}/src/lib.rs +0 -0
  103. {satkit-0.24.2 → satkit-0.24.3}/src/lpephem/mod.rs +0 -0
  104. {satkit-0.24.2 → satkit-0.24.3}/src/lpephem/moon.rs +0 -0
  105. {satkit-0.24.2 → satkit-0.24.3}/src/lpephem/planets.rs +0 -0
  106. {satkit-0.24.2 → satkit-0.24.3}/src/lpephem/sun.rs +0 -0
  107. {satkit-0.24.2 → satkit-0.24.3}/src/mathtypes.rs +0 -0
  108. {satkit-0.24.2 → satkit-0.24.3}/src/nrlmsise.rs +0 -0
  109. {satkit-0.24.2 → satkit-0.24.3}/src/omm/xml.rs +0 -0
  110. {satkit-0.24.2 → satkit-0.24.3}/src/orbitprop/drag.rs +0 -0
  111. {satkit-0.24.2 → satkit-0.24.3}/src/orbitprop/error.rs +0 -0
  112. {satkit-0.24.2 → satkit-0.24.3}/src/orbitprop/mod.rs +0 -0
  113. {satkit-0.24.2 → satkit-0.24.3}/src/orbitprop/ode/gauss_jackson.rs +0 -0
  114. {satkit-0.24.2 → satkit-0.24.3}/src/orbitprop/ode/mod.rs +0 -0
  115. {satkit-0.24.2 → satkit-0.24.3}/src/orbitprop/point_gravity.rs +0 -0
  116. {satkit-0.24.2 → satkit-0.24.3}/src/orbitprop/precomputed.rs +0 -0
  117. {satkit-0.24.2 → satkit-0.24.3}/src/orbitprop/propagator.rs +0 -0
  118. {satkit-0.24.2 → satkit-0.24.3}/src/orbitprop/relativity.rs +0 -0
  119. {satkit-0.24.2 → satkit-0.24.3}/src/orbitprop/satproperties.rs +0 -0
  120. {satkit-0.24.2 → satkit-0.24.3}/src/orbitprop/satstate.rs +0 -0
  121. {satkit-0.24.2 → satkit-0.24.3}/src/orbitprop/settings.rs +0 -0
  122. {satkit-0.24.2 → satkit-0.24.3}/src/orbitprop/srp.rs +0 -0
  123. {satkit-0.24.2 → satkit-0.24.3}/src/orbitprop/thrust.rs +0 -0
  124. {satkit-0.24.2 → satkit-0.24.3}/src/orbitprop/tides.rs +0 -0
  125. {satkit-0.24.2 → satkit-0.24.3}/src/sgp4/dpper.rs +0 -0
  126. {satkit-0.24.2 → satkit-0.24.3}/src/sgp4/dscom.rs +0 -0
  127. {satkit-0.24.2 → satkit-0.24.3}/src/sgp4/dsinit.rs +0 -0
  128. {satkit-0.24.2 → satkit-0.24.3}/src/sgp4/dspace.rs +0 -0
  129. {satkit-0.24.2 → satkit-0.24.3}/src/sgp4/error.rs +0 -0
  130. {satkit-0.24.2 → satkit-0.24.3}/src/sgp4/getgravconst.rs +0 -0
  131. {satkit-0.24.2 → satkit-0.24.3}/src/sgp4/initl.rs +0 -0
  132. {satkit-0.24.2 → satkit-0.24.3}/src/sgp4/mod.rs +0 -0
  133. {satkit-0.24.2 → satkit-0.24.3}/src/sgp4/satrec.rs +0 -0
  134. {satkit-0.24.2 → satkit-0.24.3}/src/sgp4/sgp4_impl.rs +0 -0
  135. {satkit-0.24.2 → satkit-0.24.3}/src/sgp4/sgp4_lowlevel.rs +0 -0
  136. {satkit-0.24.2 → satkit-0.24.3}/src/sgp4/sgp4init.rs +0 -0
  137. {satkit-0.24.2 → satkit-0.24.3}/src/solarsystem.rs +0 -0
  138. {satkit-0.24.2 → satkit-0.24.3}/src/spaceweather/assemble.rs +0 -0
  139. {satkit-0.24.2 → satkit-0.24.3}/src/spaceweather/cssi.rs +0 -0
  140. {satkit-0.24.2 → satkit-0.24.3}/src/spaceweather/gfz.rs +0 -0
  141. {satkit-0.24.2 → satkit-0.24.3}/src/spaceweather/mod.rs +0 -0
  142. {satkit-0.24.2 → satkit-0.24.3}/src/spaceweather/msafe.rs +0 -0
  143. {satkit-0.24.2 → satkit-0.24.3}/src/spaceweather/swpc.rs +0 -0
  144. {satkit-0.24.2 → satkit-0.24.3}/src/time/chrono.rs +0 -0
  145. {satkit-0.24.2 → satkit-0.24.3}/src/time/duration.rs +0 -0
  146. {satkit-0.24.2 → satkit-0.24.3}/src/time/instant.rs +0 -0
  147. {satkit-0.24.2 → satkit-0.24.3}/src/time/instant_err.rs +0 -0
  148. {satkit-0.24.2 → satkit-0.24.3}/src/time/instant_ops.rs +0 -0
  149. {satkit-0.24.2 → satkit-0.24.3}/src/time/instantparse.rs +0 -0
  150. {satkit-0.24.2 → satkit-0.24.3}/src/time/mod.rs +0 -0
  151. {satkit-0.24.2 → satkit-0.24.3}/src/time/tests.rs +0 -0
  152. {satkit-0.24.2 → satkit-0.24.3}/src/time/timelike.rs +0 -0
  153. {satkit-0.24.2 → satkit-0.24.3}/src/time/timescale.rs +0 -0
  154. {satkit-0.24.2 → satkit-0.24.3}/src/time/utc_pre1972.rs +0 -0
  155. {satkit-0.24.2 → satkit-0.24.3}/src/time/weekday.rs +0 -0
  156. {satkit-0.24.2 → satkit-0.24.3}/src/tle/error.rs +0 -0
  157. {satkit-0.24.2 → satkit-0.24.3}/src/tle/fitting.rs +0 -0
  158. {satkit-0.24.2 → satkit-0.24.3}/src/utils/datadir.rs +0 -0
  159. {satkit-0.24.2 → satkit-0.24.3}/src/utils/diag.rs +0 -0
  160. {satkit-0.24.2 → satkit-0.24.3}/src/utils/download.rs +0 -0
  161. {satkit-0.24.2 → satkit-0.24.3}/src/utils/embedded.rs +0 -0
  162. {satkit-0.24.2 → satkit-0.24.3}/src/utils/manifest.rs +0 -0
  163. {satkit-0.24.2 → satkit-0.24.3}/src/utils/mod.rs +0 -0
  164. {satkit-0.24.2 → satkit-0.24.3}/src/utils/singleton.rs +0 -0
  165. {satkit-0.24.2 → satkit-0.24.3}/src/utils/test.rs +0 -0
  166. {satkit-0.24.2 → satkit-0.24.3}/src/utils/update_data.rs +0 -0
@@ -85,9 +85,9 @@ dependencies = [
85
85
 
86
86
  [[package]]
87
87
  name = "bit-vec"
88
- version = "0.10.1"
88
+ version = "0.10.2"
89
89
  source = "registry+https://github.com/rust-lang/crates.io-index"
90
- checksum = "5727b15fa97d4f4fee0a3b7c3d550ed0269f54329207b86388de918604e31269"
90
+ checksum = "72503af1e72be411d74ca45cd6b309878fcb35354e252fc2a3a8bda3a97082a0"
91
91
  dependencies = [
92
92
  "borsh",
93
93
  "serde",
@@ -129,7 +129,7 @@ dependencies = [
129
129
  "proc-macro-crate",
130
130
  "proc-macro2",
131
131
  "quote",
132
- "syn 3.0.9",
132
+ "syn 3.0.10",
133
133
  ]
134
134
 
135
135
  [[package]]
@@ -158,9 +158,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
158
158
 
159
159
  [[package]]
160
160
  name = "cc"
161
- version = "1.11.0"
161
+ version = "1.11.1"
162
162
  source = "registry+https://github.com/rust-lang/crates.io-index"
163
- checksum = "375989decec1a0fa424442bed520fa12ede43a48475ce8c7417d2c69b32b5f6b"
163
+ checksum = "4ff2a8126fff0f8c839080d619675a585e61720bb12d2baceae45769fd66f155"
164
164
  dependencies = [
165
165
  "find-msvc-tools",
166
166
  "shlex",
@@ -306,9 +306,9 @@ dependencies = [
306
306
 
307
307
  [[package]]
308
308
  name = "crc32fast"
309
- version = "1.5.4"
309
+ version = "1.5.5"
310
310
  source = "registry+https://github.com/rust-lang/crates.io-index"
311
- checksum = "5f97d3416d5337d15c4b0d78c8c91df922ca143f57ec20e2d1c188333047ef04"
311
+ checksum = "2b929dd2a135771f40afabd1073f85eed59c800b7c61901e5c254270497dad64"
312
312
  dependencies = [
313
313
  "cfg-if",
314
314
  ]
@@ -435,9 +435,9 @@ checksum = "1c66915cc5391097de7a2b0b972e8505aa33c0df401fd3a6811dbdb32881ba48"
435
435
 
436
436
  [[package]]
437
437
  name = "flate2"
438
- version = "1.1.10"
438
+ version = "1.1.11"
439
439
  source = "registry+https://github.com/rust-lang/crates.io-index"
440
- checksum = "6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb"
440
+ checksum = "626d4928326b646e70f65ed36fc7cf9f206bdb68a0019ee7c6b4709da4e084c4"
441
441
  dependencies = [
442
442
  "crc32fast",
443
443
  "miniz_oxide",
@@ -609,9 +609,9 @@ dependencies = [
609
609
 
610
610
  [[package]]
611
611
  name = "itoa"
612
- version = "1.0.18"
612
+ version = "1.0.19"
613
613
  source = "registry+https://github.com/rust-lang/crates.io-index"
614
- checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
614
+ checksum = "3bd1574e617a9a6c1f8f8181bd7e841e1f20e4277607ef28945765188d6284d4"
615
615
 
616
616
  [[package]]
617
617
  name = "jni"
@@ -986,7 +986,7 @@ dependencies = [
986
986
  "proc-macro2",
987
987
  "pyo3-macros-backend",
988
988
  "quote",
989
- "syn 3.0.9",
989
+ "syn 3.0.10",
990
990
  ]
991
991
 
992
992
  [[package]]
@@ -998,7 +998,7 @@ dependencies = [
998
998
  "heck",
999
999
  "proc-macro2",
1000
1000
  "quote",
1001
- "syn 3.0.9",
1001
+ "syn 3.0.10",
1002
1002
  ]
1003
1003
 
1004
1004
  [[package]]
@@ -1228,9 +1228,9 @@ dependencies = [
1228
1228
 
1229
1229
  [[package]]
1230
1230
  name = "rustls-pki-types"
1231
- version = "1.15.1"
1231
+ version = "1.16.0"
1232
1232
  source = "registry+https://github.com/rust-lang/crates.io-index"
1233
- checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96"
1233
+ checksum = "102f35f7de7b06d8c61f1cff6592f5253e0dea431c74867aad5dfd70f44663fb"
1234
1234
  dependencies = [
1235
1235
  "zeroize",
1236
1236
  ]
@@ -1302,7 +1302,7 @@ dependencies = [
1302
1302
 
1303
1303
  [[package]]
1304
1304
  name = "satkit"
1305
- version = "0.24.2"
1305
+ version = "0.24.3"
1306
1306
  dependencies = [
1307
1307
  "anyhow",
1308
1308
  "approx",
@@ -1325,7 +1325,7 @@ dependencies = [
1325
1325
 
1326
1326
  [[package]]
1327
1327
  name = "satkit-python"
1328
- version = "0.24.2"
1328
+ version = "0.24.3"
1329
1329
  dependencies = [
1330
1330
  "anyhow",
1331
1331
  "log",
@@ -1418,7 +1418,7 @@ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348"
1418
1418
  dependencies = [
1419
1419
  "proc-macro2",
1420
1420
  "quote",
1421
- "syn 3.0.9",
1421
+ "syn 3.0.10",
1422
1422
  ]
1423
1423
 
1424
1424
  [[package]]
@@ -1498,9 +1498,9 @@ dependencies = [
1498
1498
 
1499
1499
  [[package]]
1500
1500
  name = "syn"
1501
- version = "3.0.9"
1501
+ version = "3.0.10"
1502
1502
  source = "registry+https://github.com/rust-lang/crates.io-index"
1503
- checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b"
1503
+ checksum = "4ae9ccbea3a7b0b09443036490c8f34a8b1b760fd345e5c0dae0aac718faea79"
1504
1504
  dependencies = [
1505
1505
  "proc-macro2",
1506
1506
  "quote",
@@ -1543,7 +1543,7 @@ checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524"
1543
1543
  dependencies = [
1544
1544
  "proc-macro2",
1545
1545
  "quote",
1546
- "syn 3.0.9",
1546
+ "syn 3.0.10",
1547
1547
  ]
1548
1548
 
1549
1549
  [[package]]
@@ -1558,18 +1558,18 @@ dependencies = [
1558
1558
 
1559
1559
  [[package]]
1560
1560
  name = "toml_datetime"
1561
- version = "1.1.2+spec-1.1.0"
1561
+ version = "1.1.3+spec-1.1.0"
1562
1562
  source = "registry+https://github.com/rust-lang/crates.io-index"
1563
- checksum = "2b86d767906c6c42421dcba507eb9d203e779497710a47782a224bb871653053"
1563
+ checksum = "173f25c883cd2176a2d8212155638c0a60d484a9d84546d270866f40f56b6e49"
1564
1564
  dependencies = [
1565
1565
  "serde_core",
1566
1566
  ]
1567
1567
 
1568
1568
  [[package]]
1569
1569
  name = "toml_edit"
1570
- version = "0.25.17+spec-1.1.0"
1570
+ version = "0.25.19+spec-1.1.0"
1571
1571
  source = "registry+https://github.com/rust-lang/crates.io-index"
1572
- checksum = "e3641d5bbb5349a79e1020a242d251efbc546ad8048d133958323ce9c40a9c9c"
1572
+ checksum = "dd43688c4858d7264ae1cf9a9f874a67c3feb74a883b1cd7bebd6a4ea8307218"
1573
1573
  dependencies = [
1574
1574
  "indexmap",
1575
1575
  "toml_datetime",
@@ -1717,7 +1717,7 @@ dependencies = [
1717
1717
  "bumpalo",
1718
1718
  "proc-macro2",
1719
1719
  "quote",
1720
- "syn 3.0.9",
1720
+ "syn 3.0.10",
1721
1721
  "wasm-bindgen-shared",
1722
1722
  ]
1723
1723
 
@@ -1742,18 +1742,18 @@ dependencies = [
1742
1742
 
1743
1743
  [[package]]
1744
1744
  name = "webpki-root-certs"
1745
- version = "1.0.11"
1745
+ version = "1.0.12"
1746
1746
  source = "registry+https://github.com/rust-lang/crates.io-index"
1747
- checksum = "e49d0e65abc00c142e8f9428da991da9f1a250c39be97459901eb12b9b49f62a"
1747
+ checksum = "293198dcebfb821155b5092ab94b5a82ff180eddd7241df3bd6e66a4ffd1a585"
1748
1748
  dependencies = [
1749
1749
  "rustls-pki-types",
1750
1750
  ]
1751
1751
 
1752
1752
  [[package]]
1753
1753
  name = "webpki-roots"
1754
- version = "1.0.11"
1754
+ version = "1.0.12"
1755
1755
  source = "registry+https://github.com/rust-lang/crates.io-index"
1756
- checksum = "f5f280bbb2b287bc8e7de7e3852945a0ff50d1bbcb5ed42b6c7a568c546df171"
1756
+ checksum = "7265c9301c16a8711c992c2d8da90ee77ef54b1ed51482d6dfeb00dc756b1297"
1757
1757
  dependencies = [
1758
1758
  "rustls-pki-types",
1759
1759
  ]
@@ -1932,9 +1932,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
1932
1932
 
1933
1933
  [[package]]
1934
1934
  name = "winnow"
1935
- version = "1.0.4"
1935
+ version = "1.0.5"
1936
1936
  source = "registry+https://github.com/rust-lang/crates.io-index"
1937
- checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81"
1937
+ checksum = "8c3b93199df0ab874cdf0c6a94f0a0dc3423fe41f1cafb62b8bd7b1deb277aef"
1938
1938
  dependencies = [
1939
1939
  "memchr",
1940
1940
  ]
@@ -3,7 +3,7 @@ members = [".", "python"]
3
3
 
4
4
  [package]
5
5
  name = "satkit"
6
- version = "0.24.2"
6
+ version = "0.24.3"
7
7
  edition = "2021"
8
8
  description = "Satellite Toolkit"
9
9
  readme = "README.md"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: satkit
3
- Version: 0.24.2
3
+ Version: 0.24.3
4
4
  Summary: Satellite Orbital Dynamics Toolkit
5
5
  Author-email: Steven Michael <ssmichael@gmail.com>
6
6
  Maintainer-email: Steven Michael <ssmichael@gmail.com>
@@ -9,7 +9,7 @@ requires-python = ">= 3.11"
9
9
  authors = [{ name = "Steven Michael", email = "ssmichael@gmail.com" }]
10
10
  maintainers = [{ name = "Steven Michael", email = "ssmichael@gmail.com" }]
11
11
  readme = "README.md"
12
- version = "0.24.2"
12
+ version = "0.24.3"
13
13
  license = "MIT OR Apache-2.0"
14
14
  description = "Satellite Orbital Dynamics Toolkit"
15
15
  keywords = [
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "satkit-python"
3
- version = "0.24.2"
3
+ version = "0.24.3"
4
4
  edition = "2021"
5
5
  publish = false
6
6
 
@@ -30,6 +30,7 @@ __all__ = [
30
30
  "density",
31
31
  "solarsystem",
32
32
  "TLE",
33
+ "TLEWarning",
33
34
  "itrfcoord",
34
35
  "geodetic",
35
36
  "kepler",
@@ -32,7 +32,8 @@ class OMMDict(TypedDict, total=False):
32
32
  as strings in its JSON; :func:`sgp4` accepts either), ``EPOCH`` as an
33
33
  RFC 3339 string, absent optional fields omitted, and every key that is not
34
34
  a CCSDS field (Space-Track's ``OBJECT_TYPE``, ``RCS_SIZE``, ``LAUNCH_DATE``,
35
- ``TLE_LINE1``, ...; XML ``USER_DEFINED`` parameters) kept verbatim.
35
+ ``TLE_LINE1``, ...; XML ``USER_DEFINED`` parameters; extra CSV columns, as
36
+ strings) kept verbatim.
36
37
  """
37
38
 
38
39
  CCSDS_OMM_VERS: str
@@ -11,7 +11,7 @@ import numpy as np
11
11
  import datetime
12
12
 
13
13
  from collections.abc import Sequence
14
- from typing import Any, ClassVar, Optional, TypeAlias, Union, final, overload
14
+ from typing import Any, ClassVar, Literal, Optional, TypeAlias, Union, final, overload
15
15
  from typing_extensions import deprecated
16
16
 
17
17
  from ._types import OMMDict
@@ -40,6 +40,13 @@ TimeArrayLike: TypeAlias = (
40
40
  )
41
41
  TimeInput: TypeAlias = "TimeScalar | TimeArrayLike"
42
42
 
43
+ class TLEWarning(UserWarning):
44
+ """Warning for a TLE record skipped by a loader called with ``on_error="warn"``
45
+
46
+ The message is the one ``on_error="raise"`` raises as ``RuntimeError``: it gives
47
+ the input line the record starts on, its satellite and what failed to parse.
48
+ """
49
+
43
50
  @final
44
51
  class TLE:
45
52
  """Two-Line Element Set (TLE) representing a satellite ephemeris
@@ -73,12 +80,18 @@ class TLE:
73
80
  """
74
81
 
75
82
  @staticmethod
76
- def from_file(filename: str, *, check_checksum: bool = False) -> list[TLE]:
83
+ def from_file(
84
+ filename: str,
85
+ *,
86
+ check_checksum: bool = False,
87
+ on_error: Literal["raise", "warn", "skip"] = "raise",
88
+ ) -> list[TLE]:
77
89
  """Load TLEs from a text file, parsed as :meth:`TLE.from_lines` does
78
90
 
79
91
  Args:
80
92
  filename (str): name of the text file holding the TLE lines
81
93
  check_checksum (bool, optional): as in :meth:`TLE.from_lines`
94
+ on_error (str, optional): as in :meth:`TLE.from_lines`
82
95
 
83
96
  Returns:
84
97
  list[TLE]: one TLE per element set in the file
@@ -97,7 +110,12 @@ class TLE:
97
110
  ...
98
111
 
99
112
  @staticmethod
100
- def from_lines(lines: Sequence[str], *, check_checksum: bool = False) -> list[TLE]:
113
+ def from_lines(
114
+ lines: Sequence[str],
115
+ *,
116
+ check_checksum: bool = False,
117
+ on_error: Literal["raise", "warn", "skip"] = "raise",
118
+ ) -> list[TLE]:
101
119
  """Load TLEs from a list of lines
102
120
 
103
121
  :meth:`TLE.from_file` and :meth:`TLE.from_url` parse their text the
@@ -109,20 +127,48 @@ class TLE:
109
127
  e.g. list or tuple)
110
128
  check_checksum (bool, optional): also verify the checksum digit
111
129
  (column 69) of every data line. Default False.
130
+ on_error (str, optional): what to do with a record that fails to
131
+ parse: ``"raise"`` (default) raises ``RuntimeError`` at the
132
+ first one; ``"warn"`` leaves it out and emits a
133
+ :class:`TLEWarning` with the same message; ``"skip"`` leaves
134
+ it out silently
112
135
 
113
136
  Returns:
114
- list[TLE]: one TLE per element set, even if there is only one
137
+ list[TLE]: one TLE per element set, even if there is only one.
138
+ With ``on_error="warn"`` or ``"skip"``, one per element set that
139
+ parsed, which is an empty list if none did.
115
140
 
116
141
  Raises:
117
- ValueError: if the lines hold no TLEs
118
- RuntimeError: if a record fails to parse (or, with
119
- ``check_checksum``, has a wrong checksum); the message gives
120
- the line the record starts on and its satellite
142
+ ValueError: if the lines hold no TLEs, or ``on_error`` is not one
143
+ of the three values
144
+ RuntimeError: with ``on_error="raise"``, if a record fails to
145
+ parse (or, with ``check_checksum``, has a wrong checksum); the
146
+ message gives the line the record starts on and its satellite
147
+
148
+ Example:
149
+ ```python
150
+ import warnings
151
+
152
+ lines = [
153
+ "1 25544U 98067A 21264.51782528 .00002893 00000-0 58680-4 0 9991",
154
+ "2 25544 51.6442 208.5856 0001458 47.2277 50.1624 15.48919419302878",
155
+ # A letter O in the epoch day
156
+ "1 49140U 21082L 24O30.39663557 .00000076 00000-0 14180-4 0 9995",
157
+ "2 49140 70.0008 34.1139 0002663 260.3521 99.7337 14.98327656131736",
158
+ ]
159
+ with warnings.catch_warnings(record=True) as skipped:
160
+ warnings.simplefilter("always")
161
+ tles = satkit.TLE.from_lines(lines, on_error="warn")
162
+ print(len(tles), len(skipped))
163
+ # 1 1
164
+ ```
121
165
  """
122
166
  ...
123
167
 
124
168
  @staticmethod
125
- def from_url(url: str) -> list[TLE]:
169
+ def from_url(
170
+ url: str, *, on_error: Literal["raise", "warn", "skip"] = "raise"
171
+ ) -> list[TLE]:
126
172
  """Load TLEs from a URL, parsing the response as :meth:`TLE.from_lines` does
127
173
 
128
174
  Works with any URL that returns plain-text TLE data.
@@ -4897,7 +4943,9 @@ def propagate(
4897
4943
  def omm_from_url(url: str) -> list[OMMDict]:
4898
4944
  """Load OMM(s) from a URL as a list of dictionaries
4899
4945
 
4900
- Fetches the content at the given URL and auto-detects JSON vs XML format.
4946
+ Fetches the content at the given URL and auto-detects the format (JSON,
4947
+ XML or CSV), as :func:`omm_from_text` does. A CelesTrak GP query with no
4948
+ ``FORMAT`` answers in CSV.
4901
4949
  Returns a list of dictionaries that can be passed directly to :func:`sgp4`.
4902
4950
 
4903
4951
  Args:
@@ -4922,11 +4970,13 @@ def omm_from_url(url: str) -> list[OMMDict]:
4922
4970
  ...
4923
4971
 
4924
4972
  def omm_from_file(filename: str) -> list[OMMDict]:
4925
- """Load OMM(s) from a JSON or XML file as a list of dictionaries
4973
+ """Load OMM(s) from a JSON, XML or CSV file as a list of dictionaries
4926
4974
 
4927
- The format is detected from the content, not the file extension: a file
4928
- starting with ``[`` or ``{`` is JSON (one message or an array of them), one
4929
- starting with ``<`` is a CCSDS NDM/XML document. KVN is not supported.
4975
+ The format is detected from the content, not the file extension, as
4976
+ :func:`omm_from_text` does: a file starting with ``[`` or ``{`` is JSON
4977
+ (one message or an array of them), one starting with ``<`` is a CCSDS
4978
+ NDM/XML document, and one whose first line holds a comma is a CSV table.
4979
+ KVN is not supported.
4930
4980
 
4931
4981
  Args:
4932
4982
  filename (str): path to the file
@@ -4945,11 +4995,18 @@ def omm_from_file(filename: str) -> list[OMMDict]:
4945
4995
  ...
4946
4996
 
4947
4997
  def omm_from_text(text: str) -> list[OMMDict]:
4948
- """Parse OMM(s) from JSON or XML text as a list of dictionaries
4998
+ """Parse OMM(s) from JSON, XML or CSV text as a list of dictionaries
4949
4999
 
4950
5000
  Text starting with ``[`` or ``{`` is parsed as JSON (one message or an
4951
- array of them), text starting with ``<`` as a CCSDS NDM/XML document.
4952
- KVN is not supported.
5001
+ array of them), text starting with ``<`` as a CCSDS NDM/XML document, and
5002
+ text whose first line holds a comma as CSV. KVN is not supported.
5003
+
5004
+ The CSV form is a header row of OMM keywords and one row per message, as
5005
+ CelesTrak (its default for GP queries) and Space-Track serve it. Fields
5006
+ may be quoted and columns may come in any order. An empty cell is an
5007
+ absent field, except ``OBJECT_NAME`` and ``OBJECT_ID``, which stay empty
5008
+ strings; columns that are not OMM fields are kept as strings (``None``
5009
+ where empty).
4953
5010
 
4954
5011
  Args:
4955
5012
  text (str): the document
@@ -4957,6 +5014,11 @@ def omm_from_text(text: str) -> list[OMMDict]:
4957
5014
  Returns:
4958
5015
  list[OMMDict]: one dictionary per message (see :class:`OMMDict`)
4959
5016
 
5017
+ Raises:
5018
+ RuntimeError: if the text is none of the three formats or is
5019
+ malformed; for CSV the message gives the line of the bad row, and
5020
+ a table with no ``EPOCH`` or ``MEAN_MOTION`` column is refused
5021
+
4960
5022
  Example:
4961
5023
  ```python
4962
5024
  import satkit as sk
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: satkit
3
- Version: 0.24.2
3
+ Version: 0.24.3
4
4
  Summary: Satellite Orbital Dynamics Toolkit
5
5
  Author-email: Steven Michael <ssmichael@gmail.com>
6
6
  Maintainer-email: Steven Michael <ssmichael@gmail.com>
@@ -101,6 +101,7 @@ src/lpephem/mod.rs
101
101
  src/lpephem/moon.rs
102
102
  src/lpephem/planets.rs
103
103
  src/lpephem/sun.rs
104
+ src/omm/csv.rs
104
105
  src/omm/error.rs
105
106
  src/omm/mod.rs
106
107
  src/omm/xml.rs
@@ -173,6 +173,7 @@ pub fn satkit(_py: Python, m: &Bound<'_, PyModule>) -> PyResult<()> {
173
173
  m.add_class::<pyconsts::Consts>()?;
174
174
  m.add_class::<SolarSystem>()?;
175
175
  m.add_class::<pytle::PyTLE>()?;
176
+ m.add("TLEWarning", m.py().get_type::<pytle::TLEWarning>())?;
176
177
  m.add_class::<pytlefitstatus::PyTleFitStatus>()?;
177
178
 
178
179
  m.add_class::<PyGeodet>()?;
@@ -206,7 +206,9 @@ fn omms_to_pylist(py: Python<'_>, omms: &[OMM]) -> PyResult<Py<PyAny>> {
206
206
 
207
207
  /// Load OMM(s) from a URL as a list of dictionaries
208
208
  ///
209
- /// Fetches the content at the given URL and auto-detects JSON vs XML format.
209
+ /// Fetches the content at the given URL and auto-detects the format (JSON,
210
+ /// XML or CSV), as ``omm_from_text`` does. A CelesTrak GP query with no
211
+ /// ``FORMAT`` answers in CSV.
210
212
  /// Returns a list of dictionaries that can be passed directly to ``satkit.sgp4()``.
211
213
  ///
212
214
  /// Args:
@@ -230,13 +232,14 @@ pub fn omm_from_url(py: Python<'_>, url: String) -> Result<Py<PyAny>> {
230
232
  Ok(omms_to_pylist(py, &omms)?)
231
233
  }
232
234
 
233
- /// Load OMM(s) from a JSON or XML file as a list of dictionaries
235
+ /// Load OMM(s) from a JSON, XML or CSV file as a list of dictionaries
234
236
  ///
235
- /// The format is detected from the content, not the file extension.
237
+ /// The format is detected from the content, not the file extension, as
238
+ /// ``omm_from_text`` does.
236
239
  ///
237
240
  /// Args:
238
241
  /// filename (str): Path to a file holding one OMM or an array of them
239
- /// (JSON), or a CCSDS NDM/XML document
242
+ /// (JSON), a CCSDS NDM/XML document, or a CSV table
240
243
  ///
241
244
  /// Returns:
242
245
  /// list[dict]: One dict per message, see ``satkit.OMMDict``
@@ -246,16 +249,23 @@ pub fn omm_from_file(py: Python<'_>, filename: String) -> Result<Py<PyAny>> {
246
249
  Ok(omms_to_pylist(py, &omms)?)
247
250
  }
248
251
 
249
- /// Parse OMM(s) from JSON or XML text as a list of dictionaries
252
+ /// Parse OMM(s) from JSON, XML or CSV text as a list of dictionaries
250
253
  ///
251
254
  /// Text starting with ``[`` or ``{`` is parsed as JSON, text starting with
252
- /// ``<`` as XML.
255
+ /// ``<`` as XML, and text whose first line holds a comma as CSV: a header
256
+ /// row of OMM keywords and one row per message, as CelesTrak and Space-Track
257
+ /// serve it. KVN is not supported.
253
258
  ///
254
259
  /// Args:
255
- /// text (str): One OMM or an array of them (JSON), or a CCSDS NDM/XML document
260
+ /// text (str): One OMM or an array of them (JSON), a CCSDS NDM/XML
261
+ /// document, or a CSV table
256
262
  ///
257
263
  /// Returns:
258
264
  /// list[dict]: One dict per message, see ``satkit.OMMDict``
265
+ ///
266
+ /// Raises:
267
+ /// RuntimeError: if the text is none of the three formats or is
268
+ /// malformed; for CSV the message gives the line of the bad row
259
269
  #[pyfunction]
260
270
  pub fn omm_from_text(py: Python<'_>, text: String) -> Result<Py<PyAny>> {
261
271
  let omms = py.detach(|| OMM::from_text(&text))?;