pyobs-core 2.0.0.dev15__tar.gz → 2.0.0.dev17__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 (437) hide show
  1. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/PKG-INFO +1 -1
  2. pyobs_core-2.0.0.dev17/pyobs/interfaces/IStructuredConfig.py +47 -0
  3. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/__init__.py +5 -0
  4. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/camera/basevideo.py +12 -0
  5. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/utils/httpfilecache.py +18 -1
  6. pyobs_core-2.0.0.dev17/pyobs/robotic/scheduler/targets/__init__.py +7 -0
  7. pyobs_core-2.0.0.dev15/pyobs/robotic/scheduler/targets/heliocentricpolar.py → pyobs_core-2.0.0.dev17/pyobs/robotic/scheduler/targets/heliocentricpolartarget.py +2 -2
  8. pyobs_core-2.0.0.dev15/pyobs/robotic/scheduler/targets/helioprojectiveradialarget.py → pyobs_core-2.0.0.dev17/pyobs/robotic/scheduler/targets/helioprojectivetarget.py +9 -9
  9. pyobs_core-2.0.0.dev17/pyobs/utils/config_schema.py +128 -0
  10. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyproject.toml +1 -1
  11. pyobs_core-2.0.0.dev15/pyobs/robotic/scheduler/targets/__init__.py +0 -7
  12. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/.gitignore +0 -0
  13. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/LICENSE +0 -0
  14. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/__init__.py +0 -0
  15. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/application.py +0 -0
  16. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/background_task.py +0 -0
  17. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/cli/__init__.py +0 -0
  18. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/cli/_cli.py +0 -0
  19. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/cli/pyobs.py +0 -0
  20. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/cli/pyobsd.py +0 -0
  21. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/cli/pyobsw.py +0 -0
  22. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/__init__.py +0 -0
  23. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/comm.py +0 -0
  24. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/commlogging.py +0 -0
  25. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/dummy/__init__.py +0 -0
  26. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/dummy/dummycomm.py +0 -0
  27. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/local/__init__.py +0 -0
  28. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/local/localcomm.py +0 -0
  29. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/local/localnetwork.py +0 -0
  30. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/proxy.py +0 -0
  31. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/xmpp/__init__.py +0 -0
  32. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/xmpp/rpc.py +0 -0
  33. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/xmpp/serializer.py +0 -0
  34. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/xmpp/xep_0009/__init__.py +0 -0
  35. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/xmpp/xep_0009/binding.py +0 -0
  36. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/xmpp/xep_0009/rpc.py +0 -0
  37. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/xmpp/xep_0009_timeout/__init__.py +0 -0
  38. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/xmpp/xep_0009_timeout/rpc.py +0 -0
  39. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/xmpp/xep_0009_timeout/stanza/RPC.py +0 -0
  40. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/xmpp/xep_0009_timeout/stanza/__init__.py +0 -0
  41. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/xmpp/xmppclient.py +0 -0
  42. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/xmpp/xmppcomm.py +0 -0
  43. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/__init__.py +0 -0
  44. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/badweather.py +0 -0
  45. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/event.py +0 -0
  46. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/exposurestatuschanged.py +0 -0
  47. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/filterchanged.py +0 -0
  48. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/focusfound.py +0 -0
  49. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/goodweather.py +0 -0
  50. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/log.py +0 -0
  51. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/modechanged.py +0 -0
  52. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/moduleclosed.py +0 -0
  53. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/moduleopened.py +0 -0
  54. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/motionstatuschanged.py +0 -0
  55. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/move.py +0 -0
  56. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/newimage.py +0 -0
  57. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/newspectrum.py +0 -0
  58. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/offsets.py +0 -0
  59. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/roofclosing.py +0 -0
  60. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/roofopened.py +0 -0
  61. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/taskfailed.py +0 -0
  62. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/taskfinished.py +0 -0
  63. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/taskstarted.py +0 -0
  64. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/testevent.py +0 -0
  65. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/__init__.py +0 -0
  66. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/image.py +0 -0
  67. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/meta/__init__.py +0 -0
  68. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/meta/altazoffsets.py +0 -0
  69. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/meta/exptime.py +0 -0
  70. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/meta/genericoffset.py +0 -0
  71. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/meta/onskydistance.py +0 -0
  72. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/meta/pixeloffsets.py +0 -0
  73. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/meta/radecoffsets.py +0 -0
  74. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/meta/skyoffsets.py +0 -0
  75. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processor.py +0 -0
  76. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/__init__.py +0 -0
  77. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/_daobackgroundremover.py +0 -0
  78. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/annotation/__init__.py +0 -0
  79. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/annotation/_pillow.py +0 -0
  80. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/annotation/circle.py +0 -0
  81. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/annotation/crosshair.py +0 -0
  82. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/annotation/text.py +0 -0
  83. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/astrometry/__init__.py +0 -0
  84. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/astrometry/_dotnet_request.py +0 -0
  85. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/astrometry/_dotnet_request_builder.py +0 -0
  86. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/astrometry/_dotnet_request_logger.py +0 -0
  87. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/astrometry/_dotnet_response_saver.py +0 -0
  88. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/astrometry/astrometry.py +0 -0
  89. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/astrometry/dotnet.py +0 -0
  90. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/calibration/__init__.py +0 -0
  91. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/calibration/_calibration_cache.py +0 -0
  92. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/calibration/_ccddata_calibrator.py +0 -0
  93. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/calibration/calibration.py +0 -0
  94. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/detection/__init__.py +0 -0
  95. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/detection/_pysep_stats_calculator.py +0 -0
  96. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/detection/_source_catalog.py +0 -0
  97. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/detection/daophot.py +0 -0
  98. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/detection/pysep.py +0 -0
  99. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/detection/simpledisk.py +0 -0
  100. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/detection/sourcedetection.py +0 -0
  101. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/exptime/__init__.py +0 -0
  102. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/exptime/exptime.py +0 -0
  103. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/exptime/star.py +0 -0
  104. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/image/__init__.py +0 -0
  105. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/image/addfitsheaders.py +0 -0
  106. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/image/download.py +0 -0
  107. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/image/flip.py +0 -0
  108. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/image/grayscale.py +0 -0
  109. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/image/httpserver.py +0 -0
  110. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/image/normalize.py +0 -0
  111. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/image/save.py +0 -0
  112. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/image/saveimage.py +0 -0
  113. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/image/smooth.py +0 -0
  114. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/image/softbin.py +0 -0
  115. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/misc/__init__.py +0 -0
  116. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/misc/addmask.py +0 -0
  117. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/misc/catalogcircularmask.py +0 -0
  118. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/misc/circularmask.py +0 -0
  119. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/misc/createfilename.py +0 -0
  120. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/misc/imagesourcefilter.py +0 -0
  121. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/misc/removebackground.py +0 -0
  122. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/modules/__init__.py +0 -0
  123. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/modules/getfitsheaders.py +0 -0
  124. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/offsets/__init__.py +0 -0
  125. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/offsets/astrometry.py +0 -0
  126. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/offsets/brighteststar.py +0 -0
  127. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/offsets/brighteststar_guiding.py +0 -0
  128. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/offsets/dummyoffsets.py +0 -0
  129. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/offsets/dummyskyoffsets.py +0 -0
  130. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/offsets/fitsheader.py +0 -0
  131. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/offsets/offsets.py +0 -0
  132. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/offsets/pixeloffsets.py +0 -0
  133. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/offsets/projected.py +0 -0
  134. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/offsets/spilled_light.py +0 -0
  135. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/photometry/__init__.py +0 -0
  136. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/photometry/_photometry_calculator.py +0 -0
  137. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/photometry/_photutil_aperture_photometry.py +0 -0
  138. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/photometry/_sep_aperture_photometry.py +0 -0
  139. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/photometry/aperture_photometry.py +0 -0
  140. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/photometry/photometry.py +0 -0
  141. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/photometry/photutil.py +0 -0
  142. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/photometry/pysep.py +0 -0
  143. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/wcs/__init__.py +0 -0
  144. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/wcs/solarhelioprojective.py +0 -0
  145. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IAbortable.py +0 -0
  146. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IAcquisition.py +0 -0
  147. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IAutoFocus.py +0 -0
  148. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IAutoGuiding.py +0 -0
  149. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IAutonomous.py +0 -0
  150. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IBinning.py +0 -0
  151. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/ICalibrate.py +0 -0
  152. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/ICamera.py +0 -0
  153. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IConfig.py +0 -0
  154. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/ICooling.py +0 -0
  155. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IData.py +0 -0
  156. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IDome.py +0 -0
  157. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IExposure.py +0 -0
  158. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IExposureTime.py +0 -0
  159. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IFilters.py +0 -0
  160. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IFitsHeaderAfter.py +0 -0
  161. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IFitsHeaderBefore.py +0 -0
  162. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IFlatField.py +0 -0
  163. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IFocusModel.py +0 -0
  164. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IFocuser.py +0 -0
  165. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IGain.py +0 -0
  166. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IImageFormat.py +0 -0
  167. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IImageType.py +0 -0
  168. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IMode.py +0 -0
  169. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IModule.py +0 -0
  170. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IMotion.py +0 -0
  171. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IMultiFiber.py +0 -0
  172. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IOffsetsAltAz.py +0 -0
  173. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IOffsetsRaDec.py +0 -0
  174. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IPointingAltAz.py +0 -0
  175. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IPointingHGS.py +0 -0
  176. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IPointingHelioprojective.py +0 -0
  177. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IPointingRaDec.py +0 -0
  178. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IPointingSeries.py +0 -0
  179. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IReady.py +0 -0
  180. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IRoof.py +0 -0
  181. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IRotation.py +0 -0
  182. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IRunnable.py +0 -0
  183. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IRunning.py +0 -0
  184. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IScriptRunner.py +0 -0
  185. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/ISpectrograph.py +0 -0
  186. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IStartStop.py +0 -0
  187. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/ISyncTarget.py +0 -0
  188. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/ITelescope.py +0 -0
  189. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/ITemperatures.py +0 -0
  190. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IVideo.py +0 -0
  191. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IWeather.py +0 -0
  192. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IWindow.py +0 -0
  193. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/interface.py +0 -0
  194. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/mixins/__init__.py +0 -0
  195. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/mixins/camerasettings.py +0 -0
  196. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/mixins/fitsheader.py +0 -0
  197. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/mixins/fitsnamespace.py +0 -0
  198. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/mixins/follow.py +0 -0
  199. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/mixins/motionstatus.py +0 -0
  200. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/mixins/pipeline.py +0 -0
  201. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/mixins/waitformotion.py +0 -0
  202. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/mixins/weatheraware.py +0 -0
  203. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/__init__.py +0 -0
  204. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/camera/__init__.py +0 -0
  205. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/camera/adaptive.py +0 -0
  206. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/camera/basecamera.py +0 -0
  207. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/camera/basespectrograph.py +0 -0
  208. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/camera/dummycamera.py +0 -0
  209. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/camera/dummyspectrograph.py +0 -0
  210. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/camera/dummyvideo.py +0 -0
  211. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/camera/pipelinecamera.py +0 -0
  212. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/flatfield/__init__.py +0 -0
  213. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/flatfield/flatfield.py +0 -0
  214. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/flatfield/pointing.py +0 -0
  215. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/flatfield/scheduler.py +0 -0
  216. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/focus/__init__.py +0 -0
  217. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/focus/dummyautofocus.py +0 -0
  218. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/focus/focusmodel.py +0 -0
  219. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/focus/focusseries.py +0 -0
  220. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/image/__init__.py +0 -0
  221. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/image/imagewatcher.py +0 -0
  222. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/image/imagewriter.py +0 -0
  223. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/image/pipeline.py +0 -0
  224. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/image/seeing.py +0 -0
  225. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/module.py +0 -0
  226. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/pointing/__init__.py +0 -0
  227. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/pointing/_base.py +0 -0
  228. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/pointing/_baseguiding.py +0 -0
  229. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/pointing/acquisition.py +0 -0
  230. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/pointing/autoguiding.py +0 -0
  231. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/pointing/dummyacquisition.py +0 -0
  232. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/pointing/dummyguiding.py +0 -0
  233. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/pointing/guidingstatistics/__init__.py +0 -0
  234. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/pointing/guidingstatistics/guidingstatistics.py +0 -0
  235. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/pointing/guidingstatistics/pixeloffset.py +0 -0
  236. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/pointing/guidingstatistics/skyoffsets.py +0 -0
  237. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/pointing/guidingstatistics/uptime.py +0 -0
  238. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/pointing/scienceframeguiding.py +0 -0
  239. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/robotic/__init__.py +0 -0
  240. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/robotic/mastermind.py +0 -0
  241. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/robotic/pointing.py +0 -0
  242. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/robotic/scheduler.py +0 -0
  243. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/robotic/scriptrunner.py +0 -0
  244. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/roof/__init__.py +0 -0
  245. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/roof/basedome.py +0 -0
  246. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/roof/baseroof.py +0 -0
  247. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/roof/dummyroof.py +0 -0
  248. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/telescope/__init__.py +0 -0
  249. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/telescope/basetelescope.py +0 -0
  250. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/telescope/dummytelescope.py +0 -0
  251. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/test/__init__.py +0 -0
  252. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/test/standalone.py +0 -0
  253. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/utils/__init__.py +0 -0
  254. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/utils/autonomouswarning.py +0 -0
  255. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/utils/dummymode.py +0 -0
  256. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/utils/fluentlogger.py +0 -0
  257. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/utils/kiosk.py +0 -0
  258. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/utils/matrix.py +0 -0
  259. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/utils/stellarium.py +0 -0
  260. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/utils/telegram.py +0 -0
  261. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/utils/trigger.py +0 -0
  262. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/weather/__init__.py +0 -0
  263. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/weather/mockweather.py +0 -0
  264. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/weather/weather.py +0 -0
  265. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/weather/weather_api.py +0 -0
  266. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/weather/weather_state.py +0 -0
  267. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/object.py +0 -0
  268. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/py.typed +0 -0
  269. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/__init__.py +0 -0
  270. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/observation.py +0 -0
  271. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/__init__.py +0 -0
  272. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/astroplanscheduler.py +0 -0
  273. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/constraints/__init__.py +0 -0
  274. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/constraints/airmassconstraint.py +0 -0
  275. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/constraints/constraint.py +0 -0
  276. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/constraints/moonilluminationconstraint.py +0 -0
  277. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/constraints/moonseparationconstraint.py +0 -0
  278. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/constraints/solarelevationconstraint.py +0 -0
  279. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/constraints/timeconstraint.py +0 -0
  280. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/dataprovider.py +0 -0
  281. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/merits/__init__.py +0 -0
  282. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/merits/aftertime.py +0 -0
  283. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/merits/beforetime.py +0 -0
  284. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/merits/constant.py +0 -0
  285. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/merits/follow.py +0 -0
  286. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/merits/interval.py +0 -0
  287. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/merits/merit.py +0 -0
  288. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/merits/pernight.py +0 -0
  289. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/merits/random.py +0 -0
  290. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/merits/timewindow.py +0 -0
  291. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/merits/transit.py +0 -0
  292. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/observationarchiveevolution.py +0 -0
  293. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/ondemandscheduler.py +0 -0
  294. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/targets/dynamictarget.py +0 -0
  295. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/targets/picker/__init__.py +0 -0
  296. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/targets/picker/csvpicker.py +0 -0
  297. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/targets/picker/picker.py +0 -0
  298. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/targets/siderealtarget.py +0 -0
  299. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/targets/target.py +0 -0
  300. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/taskscheduler.py +0 -0
  301. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/__init__.py +0 -0
  302. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/calibration/__init__.py +0 -0
  303. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/calibration/darkbias.py +0 -0
  304. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/calibration/pointing.py +0 -0
  305. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/calibration/skyflats.py +0 -0
  306. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/control/__init__.py +0 -0
  307. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/control/cases.py +0 -0
  308. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/control/conditional.py +0 -0
  309. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/control/parallel.py +0 -0
  310. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/control/selector.py +0 -0
  311. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/control/sequential.py +0 -0
  312. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/imaging/__init__.py +0 -0
  313. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/imaging/autofocus.py +0 -0
  314. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/imaging/imaging.py +0 -0
  315. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/imaging/transitimaging.py +0 -0
  316. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/script.py +0 -0
  317. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/utils/__init__.py +0 -0
  318. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/utils/callmodule.py +0 -0
  319. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/utils/debugtrigger.py +0 -0
  320. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/utils/log.py +0 -0
  321. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/__init__.py +0 -0
  322. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/backend/__init__.py +0 -0
  323. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/backend/observationarchive.py +0 -0
  324. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/backend/taskarchive.py +0 -0
  325. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/filesystem/__init__.py +0 -0
  326. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/filesystem/observationarchive.py +0 -0
  327. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/filesystem/taskarchive.py +0 -0
  328. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/lco/__init__.py +0 -0
  329. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/lco/_portal.py +0 -0
  330. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/lco/_schedulereader.py +0 -0
  331. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/lco/_schedulewriter.py +0 -0
  332. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/lco/configdb.py +0 -0
  333. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/lco/mockobservationarchive.py +0 -0
  334. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/lco/observationarchive.py +0 -0
  335. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/lco/scripts/__init__.py +0 -0
  336. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/lco/scripts/autofocus.py +0 -0
  337. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/lco/scripts/default.py +0 -0
  338. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/lco/scripts/script.py +0 -0
  339. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/lco/task.py +0 -0
  340. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/lco/taskarchive.py +0 -0
  341. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/lco/taskrunner.py +0 -0
  342. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/memory/__init__.py +0 -0
  343. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/memory/observationarchive.py +0 -0
  344. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/memory/taskarchive.py +0 -0
  345. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/observationarchive.py +0 -0
  346. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/taskarchive.py +0 -0
  347. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/task.py +0 -0
  348. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/taskrunner.py +0 -0
  349. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/__init__.py +0 -0
  350. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/archive/__init__.py +0 -0
  351. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/archive/archive.py +0 -0
  352. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/archive/local_archive.py +0 -0
  353. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/archive/pyobs_archive.py +0 -0
  354. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/exptime/__init__.py +0 -0
  355. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/exptime/exptime.py +0 -0
  356. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/exptime/stellarexptime.py +0 -0
  357. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/skyflats/__init__.py +0 -0
  358. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/skyflats/exptimeeval.py +0 -0
  359. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/skyflats/flatfielder.py +0 -0
  360. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/skyflats/pointing/__init__.py +0 -0
  361. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/skyflats/pointing/base.py +0 -0
  362. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/skyflats/pointing/static.py +0 -0
  363. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/skyflats/priorities/__init__.py +0 -0
  364. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/skyflats/priorities/archive.py +0 -0
  365. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/skyflats/priorities/base.py +0 -0
  366. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/skyflats/priorities/const.py +0 -0
  367. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/skyflats/scheduler.py +0 -0
  368. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/__init__.py +0 -0
  369. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/average.py +0 -0
  370. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/cache.py +0 -0
  371. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/config.py +0 -0
  372. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/coordinates.py +0 -0
  373. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/curvefit.py +0 -0
  374. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/enums.py +0 -0
  375. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/exceptions.py +0 -0
  376. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/fits.py +0 -0
  377. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/focusseries/__init__.py +0 -0
  378. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/focusseries/base.py +0 -0
  379. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/focusseries/photometry.py +0 -0
  380. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/focusseries/projection.py +0 -0
  381. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/grids/__init__.py +0 -0
  382. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/grids/filters.py +0 -0
  383. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/grids/grid.py +0 -0
  384. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/grids/gridnode.py +0 -0
  385. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/grids/pipeline.py +0 -0
  386. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/gui/__init__.py +0 -0
  387. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/gui/camera/__init__.py +0 -0
  388. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/gui/camera/binningwidget.py +0 -0
  389. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/gui/camera/datadisplaywidget.py +0 -0
  390. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/gui/camera/exposewidget.py +0 -0
  391. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/gui/camera/exposuretimewidget.py +0 -0
  392. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/gui/camera/imageformatwidget.py +0 -0
  393. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/gui/camera/listpickerdialog.py +0 -0
  394. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/gui/camera/windowingwidget.py +0 -0
  395. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/http.py +0 -0
  396. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/influxdb.py +0 -0
  397. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/logger.py +0 -0
  398. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/logging/__init__.py +0 -0
  399. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/logging/context.py +0 -0
  400. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/logging/resolvableerror.py +0 -0
  401. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/modulegui.py +0 -0
  402. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/offsets/__init__.py +0 -0
  403. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/offsets/applyaltazoffsets.py +0 -0
  404. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/offsets/applyoffsets.py +0 -0
  405. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/offsets/applyradecoffsets.py +0 -0
  406. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/parallel.py +0 -0
  407. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/pipeline/__init__.py +0 -0
  408. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/pipeline/night.py +0 -0
  409. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/pipeline/pipeline.py +0 -0
  410. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/publisher/__init__.py +0 -0
  411. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/publisher/csv.py +0 -0
  412. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/publisher/http.py +0 -0
  413. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/publisher/log.py +0 -0
  414. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/publisher/multi.py +0 -0
  415. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/publisher/publisher.py +0 -0
  416. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/serialization.py +0 -0
  417. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/shellcommand.py +0 -0
  418. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/threads/__init__.py +0 -0
  419. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/threads/lockwithabort.py +0 -0
  420. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/time.py +0 -0
  421. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/units.py +0 -0
  422. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/version.py +0 -0
  423. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/vfs/__init__.py +0 -0
  424. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/vfs/archivefile.py +0 -0
  425. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/vfs/bufferedfile.py +0 -0
  426. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/vfs/file.py +0 -0
  427. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/vfs/filelists/__init__.py +0 -0
  428. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/vfs/filelists/filelist.py +0 -0
  429. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/vfs/filelists/testing.py +0 -0
  430. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/vfs/httpfile.py +0 -0
  431. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/vfs/localfile.py +0 -0
  432. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/vfs/memfile.py +0 -0
  433. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/vfs/sftpfile.py +0 -0
  434. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/vfs/smbfile.py +0 -0
  435. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/vfs/sshfile.py +0 -0
  436. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/vfs/tempfile.py +0 -0
  437. {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/vfs/vfs.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyobs-core
3
- Version: 2.0.0.dev15
3
+ Version: 2.0.0.dev17
4
4
  Summary: robotic telescope software
5
5
  Author-email: Tim-Oliver Husser <thusser@uni-goettingen.de>
6
6
  License-Expression: MIT
@@ -0,0 +1,47 @@
1
+ from __future__ import annotations
2
+
3
+ from abc import ABCMeta, abstractmethod
4
+ from dataclasses import dataclass, field
5
+ from typing import Any
6
+
7
+ from ..utils.config_schema import ConfigFieldSchema, ConfigSchema # re-export
8
+ from ..utils.time import Time
9
+ from .IConfig import ConfigScalar
10
+ from .interface import Interface
11
+
12
+ ConfigValue = ConfigScalar | list["ConfigValue"] | dict[str, "ConfigValue"]
13
+
14
+
15
+ @dataclass
16
+ class ConfigAppliedState:
17
+ config: dict[str, ConfigValue]
18
+ time: Time = field(default_factory=Time.now)
19
+
20
+
21
+ class IStructuredConfig(Interface, metaclass=ABCMeta):
22
+ """The module accepts a whole structured (possibly nested) config
23
+ object in one call, rather than per-field get/set (see IConfig for
24
+ the per-field variant)."""
25
+
26
+ __module__ = "pyobs.interfaces"
27
+
28
+ capabilities = ConfigSchema
29
+ state = ConfigAppliedState
30
+
31
+ @abstractmethod
32
+ async def set_config(self, config: dict[str, ConfigValue], **kwargs: Any) -> None:
33
+ """Apply a full structured config to this module.
34
+
35
+ Args:
36
+ config: Nested dict matching this module's ConfigSchema
37
+ (fetch via get_capabilities). Values are validated and
38
+ deserialized into the module's internal config dataclass.
39
+
40
+ Raises:
41
+ ValueError: If config doesn't match the module's schema, or
42
+ values fail validation.
43
+ """
44
+ ...
45
+
46
+
47
+ __all__ = ["IStructuredConfig", "ConfigAppliedState", "ConfigSchema", "ConfigFieldSchema"]
@@ -55,6 +55,7 @@ from .IRunning import IRunning, RunningState
55
55
  from .IScriptRunner import IScriptRunner
56
56
  from .ISpectrograph import ISpectrograph
57
57
  from .IStartStop import IStartStop
58
+ from .IStructuredConfig import ConfigAppliedState, ConfigFieldSchema, ConfigSchema, IStructuredConfig
58
59
  from .ISyncTarget import ISyncTarget
59
60
  from .ITelescope import ITelescope
60
61
  from .ITemperatures import ITemperatures, SensorReading, TemperaturesState
@@ -142,6 +143,10 @@ __all__ = [
142
143
  "RunningState",
143
144
  "IScriptRunner",
144
145
  "IStartStop",
146
+ "IStructuredConfig",
147
+ "ConfigAppliedState",
148
+ "ConfigSchema",
149
+ "ConfigFieldSchema",
145
150
  "ISyncTarget",
146
151
  "ITelescope",
147
152
  "ITemperatures",
@@ -147,6 +147,7 @@ class BaseVideo(Module, ImageFitsHeaderMixin, IVideo, IImageType, metaclass=ABCM
147
147
  self._app.add_routes(
148
148
  [
149
149
  web.get("/", self.web_handler),
150
+ web.get("/ping", self.ping_handler),
150
151
  web.get("/video.mjpg", self.video_handler),
151
152
  web.get("/{filename}", self.image_handler),
152
153
  ]
@@ -194,6 +195,17 @@ class BaseVideo(Module, ImageFitsHeaderMixin, IVideo, IImageType, metaclass=ABCM
194
195
  """
195
196
  return web.Response(text=INDEX_HTML, content_type="text/html")
196
197
 
198
+ async def ping_handler(self, request: web.Request) -> web.Response:
199
+ """Handles GET access to /ping for testing connectivity.
200
+
201
+ Args:
202
+ request: Request to respond to.
203
+
204
+ Returns:
205
+ Response with a JSON status.
206
+ """
207
+ return web.json_response({"status": "ok"})
208
+
197
209
  async def video_handler(self, request: web.Request) -> web.StreamResponse:
198
210
  """Handles access to /video.mjpg and returns the video.
199
211
 
@@ -34,7 +34,13 @@ class HttpFileCache(Module):
34
34
 
35
35
  # define web server
36
36
  self._app = web.Application(client_max_size=self._max_file_size)
37
- self._app.add_routes([web.get("/{filename}", self.download_handler), web.post("/", self.upload_handler)])
37
+ self._app.add_routes(
38
+ [
39
+ web.get("/ping", self.ping_handler),
40
+ web.get("/{filename}", self.download_handler),
41
+ web.post("/", self.upload_handler),
42
+ ]
43
+ )
38
44
  self._runner = web.AppRunner(self._app)
39
45
  self._site: web.TCPSite | None = None
40
46
 
@@ -61,6 +67,17 @@ class HttpFileCache(Module):
61
67
  """Whether the server is started."""
62
68
  return self._is_listening
63
69
 
70
+ async def ping_handler(self, request: web.Request) -> web.Response:
71
+ """Handles GET access to /ping for testing connectivity.
72
+
73
+ Args:
74
+ request: Request to respond to.
75
+
76
+ Returns:
77
+ Response with a JSON status.
78
+ """
79
+ return web.json_response({"status": "ok"})
80
+
64
81
  async def download_handler(self, request: web.Request) -> web.Response:
65
82
  """Handles GET access to /{filename} and returns image.
66
83
 
@@ -0,0 +1,7 @@
1
+ from .dynamictarget import DynamicTarget
2
+ from .heliocentricpolartarget import HeliocentricPolarTarget
3
+ from .helioprojectivetarget import HelioprojectiveTarget
4
+ from .siderealtarget import SiderealTarget
5
+ from .target import Target
6
+
7
+ __all__ = ["Target", "DynamicTarget", "HeliocentricPolarTarget", "HelioprojectiveTarget", "SiderealTarget"]
@@ -7,7 +7,7 @@ from pyobs.utils.time import Time
7
7
  from .target import Target
8
8
 
9
9
 
10
- class HeliocentricPolar(Target):
10
+ class HeliocentricPolarTarget(Target):
11
11
  mu: float
12
12
  psi: float
13
13
 
@@ -37,4 +37,4 @@ class HeliocentricPolar(Target):
37
37
  return f"{self.name} ({self.coord})"
38
38
 
39
39
 
40
- __all__ = ["HeliocentricPolar"]
40
+ __all__ = ["HeliocentricPolarTarget"]
@@ -5,22 +5,22 @@ from pyobs.utils.time import Time
5
5
  from .target import Target
6
6
 
7
7
 
8
- class HelioprojectiveRadialTarget(Target):
9
- psi: float
10
- delta: float
8
+ class HelioprojectiveTarget(Target):
9
+ tx: float
10
+ ty: float
11
11
 
12
12
  @property
13
13
  def coord(self) -> SkyCoord:
14
14
  return self.coordinates(Time.now())
15
15
 
16
16
  def coordinates(self, time: Time) -> SkyCoord:
17
- from sunpy.coordinates import HelioprojectiveRadial
17
+ from sunpy.coordinates import Helioprojective
18
18
 
19
19
  return SkyCoord(
20
- self.psi,
21
- self.delta,
22
- unit="deg",
23
- frame=HelioprojectiveRadial,
20
+ self.tx,
21
+ self.ty,
22
+ unit="arcsec",
23
+ frame=Helioprojective,
24
24
  observer="earth",
25
25
  obstime=time,
26
26
  )
@@ -29,4 +29,4 @@ class HelioprojectiveRadialTarget(Target):
29
29
  return f"{self.name} ({self.coord})"
30
30
 
31
31
 
32
- __all__ = ["HelioprojectiveRadialTarget"]
32
+ __all__ = ["HelioprojectiveTarget"]
@@ -0,0 +1,128 @@
1
+ from __future__ import annotations
2
+
3
+ import dataclasses
4
+ import enum
5
+ import functools
6
+ import types
7
+ import typing
8
+ from typing import Annotated, Any, get_args, get_origin, get_type_hints
9
+
10
+ from pydantic import BaseModel
11
+ from pydantic_core import PydanticUndefined
12
+
13
+ from pyobs.utils.enums import Unit
14
+
15
+
16
+ @dataclasses.dataclass
17
+ class ConfigFieldSchema:
18
+ type: str
19
+ unit: Unit | None = None
20
+ options: list[str] | None = None
21
+ default: Any | None = None
22
+ nested: dict[str, ConfigFieldSchema] | None = None
23
+
24
+
25
+ @dataclasses.dataclass
26
+ class ConfigSchema:
27
+ fields: dict[str, ConfigFieldSchema]
28
+
29
+
30
+ @functools.cache
31
+ def dataclass_to_schema(cls: type) -> ConfigSchema:
32
+ """Recursively derive a ConfigSchema from a dataclass type.
33
+
34
+ Handles: plain scalars (str/int/float/bool), Enum-typed fields (→
35
+ type="enum" with `options`), Annotated[T, Unit.X] (→ populates `unit`),
36
+ and nested dataclasses (→ type="object" with `nested`).
37
+ Raises a clear error for unsupported field types rather than silently
38
+ guessing — this schema is consumed by GUI rendering code, silent
39
+ fallbacks there are worse than a loud failure here.
40
+ """
41
+ if not dataclasses.is_dataclass(cls):
42
+ raise TypeError(f"Not a dataclass: {cls!r}")
43
+
44
+ hints = get_type_hints(cls, include_extras=True)
45
+ fields: dict[str, ConfigFieldSchema] = {}
46
+ for f in dataclasses.fields(cls):
47
+ fields[f.name] = _field_schema(hints[f.name], f.default)
48
+ return ConfigSchema(fields=fields)
49
+
50
+
51
+ def _field_schema(annotation: Any, default: Any) -> ConfigFieldSchema:
52
+ unit = None
53
+ origin = get_origin(annotation)
54
+ if origin is Annotated:
55
+ annotation, *extras = get_args(annotation)
56
+ unit = next((e for e in extras if isinstance(e, Unit)), None)
57
+
58
+ if dataclasses.is_dataclass(annotation):
59
+ nested_schema = dataclass_to_schema(annotation)
60
+ return ConfigFieldSchema(type="object", nested=nested_schema.fields)
61
+
62
+ if isinstance(annotation, type) and issubclass(annotation, enum.Enum):
63
+ return ConfigFieldSchema(
64
+ type="enum",
65
+ options=[e.value for e in annotation],
66
+ default=default if default is not dataclasses.MISSING else None,
67
+ )
68
+
69
+ type_name = {str: "str", int: "int", float: "float", bool: "bool"}.get(annotation)
70
+ if type_name is None:
71
+ raise TypeError(f"Unsupported config field type for schema: {annotation!r}")
72
+
73
+ return ConfigFieldSchema(
74
+ type=type_name,
75
+ unit=unit,
76
+ default=default if default is not dataclasses.MISSING else None,
77
+ )
78
+
79
+
80
+ @functools.cache
81
+ def pydantic_to_schema(cls: type[BaseModel]) -> ConfigSchema:
82
+ """Recursively derive a ConfigSchema from a Pydantic BaseModel.
83
+
84
+ Counterpart to dataclass_to_schema, for config objects that need to be
85
+ Pydantic models (e.g. for their own validation) rather than plain
86
+ dataclasses. Handles: plain scalars (str/int/float/bool), Literal-typed
87
+ fields (-> type="enum" with `options`), Optional[...]/`X | None`
88
+ (unwrapped), nested BaseModel fields (-> type="object" with `nested`),
89
+ and opaque `dict` fields (-> type="object" with no nested schema, for
90
+ freeform blobs). Raises for anything else unhandled, for the same
91
+ reason as dataclass_to_schema: this schema drives GUI rendering, and a
92
+ silent fallback there is worse than a loud failure here.
93
+ """
94
+ if not (isinstance(cls, type) and issubclass(cls, BaseModel)):
95
+ raise TypeError(f"Not a Pydantic model: {cls!r}")
96
+
97
+ fields: dict[str, ConfigFieldSchema] = {}
98
+ for name, info in cls.model_fields.items():
99
+ default = None if info.default is PydanticUndefined else info.default
100
+ fields[name] = _pydantic_field_schema(info.annotation, default)
101
+ return ConfigSchema(fields=fields)
102
+
103
+
104
+ def _pydantic_field_schema(annotation: Any, default: Any) -> ConfigFieldSchema:
105
+ origin = get_origin(annotation)
106
+
107
+ if origin is typing.Union or origin is types.UnionType:
108
+ args = [a for a in get_args(annotation) if a is not type(None)]
109
+ if len(args) == 1:
110
+ return _pydantic_field_schema(args[0], default)
111
+
112
+ if origin is typing.Literal:
113
+ return ConfigFieldSchema(type="enum", options=[str(v) for v in get_args(annotation)], default=default)
114
+
115
+ if isinstance(annotation, type) and issubclass(annotation, BaseModel):
116
+ return ConfigFieldSchema(type="object", nested=pydantic_to_schema(annotation).fields)
117
+
118
+ if annotation is dict or origin is dict:
119
+ return ConfigFieldSchema(type="object", default=default)
120
+
121
+ type_name = {str: "str", int: "int", float: "float", bool: "bool"}.get(annotation)
122
+ if type_name is None:
123
+ raise TypeError(f"Unsupported config field type for schema: {annotation!r}")
124
+
125
+ return ConfigFieldSchema(type=type_name, default=default)
126
+
127
+
128
+ __all__ = ["ConfigFieldSchema", "ConfigSchema", "dataclass_to_schema", "pydantic_to_schema"]
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "pyobs-core"
3
- version = "2.0.0.dev15"
3
+ version = "2.0.0.dev17"
4
4
  description = "robotic telescope software"
5
5
  authors = [{ name = "Tim-Oliver Husser", email = "thusser@uni-goettingen.de" }]
6
6
  requires-python = ">=3.11"
@@ -1,7 +0,0 @@
1
- from .dynamictarget import DynamicTarget
2
- from .heliocentricpolar import HeliocentricPolar
3
- from .helioprojectiveradialarget import HelioprojectiveRadialTarget
4
- from .siderealtarget import SiderealTarget
5
- from .target import Target
6
-
7
- __all__ = ["Target", "DynamicTarget", "HeliocentricPolar", "HelioprojectiveRadialTarget", "SiderealTarget"]