pyobs-core 2.0.0.dev80__tar.gz → 2.0.0.dev82__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 (449) hide show
  1. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/PKG-INFO +1 -1
  2. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/mixins/camerasettings.py +2 -0
  3. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/mixins/fitsheader.py +11 -4
  4. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/mixins/fitsnamespace.py +1 -0
  5. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/mixins/follow.py +2 -0
  6. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/mixins/motionstatus.py +2 -0
  7. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/mixins/pipeline.py +34 -5
  8. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/mixins/waitformotion.py +2 -0
  9. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/mixins/weatheraware.py +2 -0
  10. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/camera/basecamera.py +2 -3
  11. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/camera/basespectrograph.py +1 -4
  12. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/camera/basevideo.py +2 -3
  13. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/camera/pipelinecamera.py +1 -3
  14. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/focus/focusseries.py +1 -4
  15. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/image/pipeline.py +1 -2
  16. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/pointing/_base.py +1 -4
  17. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/pointing/acquisition.py +1 -4
  18. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/pointing/autoguiding.py +1 -4
  19. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/robotic/scheduler.py +46 -2
  20. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/roof/baseroof.py +2 -5
  21. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/telescope/_dummytelescopebase.py +1 -2
  22. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/telescope/basetelescope.py +11 -12
  23. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/utils/dummymode.py +2 -3
  24. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/object.py +5 -0
  25. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/gui/camera/windowingwidget.py +1 -1
  26. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/pipeline/pipeline.py +1 -2
  27. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyproject.toml +1 -1
  28. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/.gitignore +0 -0
  29. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/LICENSE +0 -0
  30. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/__init__.py +0 -0
  31. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/application.py +0 -0
  32. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/background_task.py +0 -0
  33. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/cli/__init__.py +0 -0
  34. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/cli/_cli.py +0 -0
  35. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/cli/pyobs.py +0 -0
  36. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/cli/pyobsd.py +0 -0
  37. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/cli/pyobsw.py +0 -0
  38. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/comm/__init__.py +0 -0
  39. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/comm/comm.py +0 -0
  40. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/comm/commlogging.py +0 -0
  41. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/comm/dummy/__init__.py +0 -0
  42. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/comm/dummy/dummycomm.py +0 -0
  43. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/comm/local/__init__.py +0 -0
  44. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/comm/local/localcomm.py +0 -0
  45. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/comm/local/localnetwork.py +0 -0
  46. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/comm/proxy.py +0 -0
  47. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/comm/xmpp/__init__.py +0 -0
  48. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/comm/xmpp/rpc.py +0 -0
  49. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/comm/xmpp/serializer.py +0 -0
  50. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/comm/xmpp/xep_0009/__init__.py +0 -0
  51. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/comm/xmpp/xep_0009/binding.py +0 -0
  52. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/comm/xmpp/xep_0009/rpc.py +0 -0
  53. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/comm/xmpp/xep_0009_timeout/__init__.py +0 -0
  54. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/comm/xmpp/xep_0009_timeout/rpc.py +0 -0
  55. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/comm/xmpp/xep_0009_timeout/stanza/RPC.py +0 -0
  56. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/comm/xmpp/xep_0009_timeout/stanza/__init__.py +0 -0
  57. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/comm/xmpp/xmppclient.py +0 -0
  58. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/comm/xmpp/xmppcomm.py +0 -0
  59. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/events/__init__.py +0 -0
  60. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/events/badweather.py +0 -0
  61. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/events/event.py +0 -0
  62. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/events/exposurestatuschanged.py +0 -0
  63. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/events/filterchanged.py +0 -0
  64. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/events/focusfound.py +0 -0
  65. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/events/goodweather.py +0 -0
  66. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/events/log.py +0 -0
  67. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/events/modechanged.py +0 -0
  68. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/events/moduleclosed.py +0 -0
  69. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/events/moduleopened.py +0 -0
  70. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/events/motionstatuschanged.py +0 -0
  71. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/events/move.py +0 -0
  72. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/events/newimage.py +0 -0
  73. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/events/newspectrum.py +0 -0
  74. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/events/offsets.py +0 -0
  75. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/events/roofclosing.py +0 -0
  76. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/events/roofopened.py +0 -0
  77. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/events/taskfailed.py +0 -0
  78. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/events/taskfinished.py +0 -0
  79. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/events/taskstarted.py +0 -0
  80. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/events/testevent.py +0 -0
  81. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/__init__.py +0 -0
  82. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/image.py +0 -0
  83. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/meta/__init__.py +0 -0
  84. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/meta/altazoffsets.py +0 -0
  85. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/meta/exptime.py +0 -0
  86. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/meta/genericoffset.py +0 -0
  87. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/meta/onskydistance.py +0 -0
  88. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/meta/pixeloffsets.py +0 -0
  89. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/meta/radecoffsets.py +0 -0
  90. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/meta/skyoffsets.py +0 -0
  91. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processor.py +0 -0
  92. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/__init__.py +0 -0
  93. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/_daobackgroundremover.py +0 -0
  94. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/annotation/__init__.py +0 -0
  95. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/annotation/_pillow.py +0 -0
  96. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/annotation/circle.py +0 -0
  97. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/annotation/crosshair.py +0 -0
  98. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/annotation/text.py +0 -0
  99. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/astrometry/__init__.py +0 -0
  100. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/astrometry/_dotnet_request.py +0 -0
  101. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/astrometry/_dotnet_request_builder.py +0 -0
  102. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/astrometry/_dotnet_request_logger.py +0 -0
  103. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/astrometry/_dotnet_response_saver.py +0 -0
  104. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/astrometry/astrometry.py +0 -0
  105. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/astrometry/dotnet.py +0 -0
  106. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/calibration/__init__.py +0 -0
  107. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/calibration/_calibration_cache.py +0 -0
  108. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/calibration/_ccddata_calibrator.py +0 -0
  109. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/calibration/calibration.py +0 -0
  110. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/detection/__init__.py +0 -0
  111. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/detection/_pysep_stats_calculator.py +0 -0
  112. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/detection/_source_catalog.py +0 -0
  113. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/detection/daophot.py +0 -0
  114. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/detection/pysep.py +0 -0
  115. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/detection/simpledisk.py +0 -0
  116. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/detection/sourcedetection.py +0 -0
  117. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/exptime/__init__.py +0 -0
  118. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/exptime/exptime.py +0 -0
  119. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/exptime/star.py +0 -0
  120. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/image/__init__.py +0 -0
  121. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/image/addfitsheaders.py +0 -0
  122. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/image/download.py +0 -0
  123. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/image/flip.py +0 -0
  124. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/image/grayscale.py +0 -0
  125. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/image/httpserver.py +0 -0
  126. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/image/normalize.py +0 -0
  127. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/image/save.py +0 -0
  128. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/image/saveimage.py +0 -0
  129. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/image/smooth.py +0 -0
  130. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/image/softbin.py +0 -0
  131. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/misc/__init__.py +0 -0
  132. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/misc/addmask.py +0 -0
  133. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/misc/catalogcircularmask.py +0 -0
  134. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/misc/circularmask.py +0 -0
  135. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/misc/createfilename.py +0 -0
  136. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/misc/imagesourcefilter.py +0 -0
  137. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/misc/removebackground.py +0 -0
  138. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/modules/__init__.py +0 -0
  139. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/modules/getfitsheaders.py +0 -0
  140. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/offsets/__init__.py +0 -0
  141. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/offsets/astrometry.py +0 -0
  142. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/offsets/brighteststar.py +0 -0
  143. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/offsets/brighteststar_guiding.py +0 -0
  144. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/offsets/dummyoffsets.py +0 -0
  145. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/offsets/dummyskyoffsets.py +0 -0
  146. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/offsets/fitsheader.py +0 -0
  147. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/offsets/offsets.py +0 -0
  148. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/offsets/pixeloffsets.py +0 -0
  149. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/offsets/projected.py +0 -0
  150. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/offsets/spilled_light.py +0 -0
  151. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/photometry/__init__.py +0 -0
  152. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/photometry/_photometry_calculator.py +0 -0
  153. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/photometry/_photutil_aperture_photometry.py +0 -0
  154. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/photometry/_sep_aperture_photometry.py +0 -0
  155. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/photometry/aperture_photometry.py +0 -0
  156. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/photometry/photometry.py +0 -0
  157. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/photometry/photutil.py +0 -0
  158. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/photometry/pysep.py +0 -0
  159. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/wcs/__init__.py +0 -0
  160. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/images/processors/wcs/solarhelioprojective.py +0 -0
  161. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IAbortable.py +0 -0
  162. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IAcquisition.py +0 -0
  163. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IAutoFocus.py +0 -0
  164. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IAutoGuiding.py +0 -0
  165. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IAutonomous.py +0 -0
  166. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IBinning.py +0 -0
  167. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/ICalibrate.py +0 -0
  168. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/ICamera.py +0 -0
  169. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IConfig.py +0 -0
  170. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/ICooling.py +0 -0
  171. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IData.py +0 -0
  172. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IDataSequence.py +0 -0
  173. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IDome.py +0 -0
  174. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IExposure.py +0 -0
  175. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IExposureTime.py +0 -0
  176. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IFilters.py +0 -0
  177. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IFitsHeaderAfter.py +0 -0
  178. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IFitsHeaderBefore.py +0 -0
  179. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IFlatField.py +0 -0
  180. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IFocusModel.py +0 -0
  181. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IFocuser.py +0 -0
  182. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IGain.py +0 -0
  183. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IImageFormat.py +0 -0
  184. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IImageType.py +0 -0
  185. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IMode.py +0 -0
  186. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IModule.py +0 -0
  187. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IMotion.py +0 -0
  188. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IMultiFiber.py +0 -0
  189. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IOffsetsAltAz.py +0 -0
  190. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IOffsetsRaDec.py +0 -0
  191. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IPointingAltAz.py +0 -0
  192. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IPointingBody.py +0 -0
  193. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IPointingHeliocentricPolar.py +0 -0
  194. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IPointingHeliographicStonyhurst.py +0 -0
  195. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IPointingHelioprojective.py +0 -0
  196. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IPointingOrbitalElements.py +0 -0
  197. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IPointingRaDec.py +0 -0
  198. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IPointingSeries.py +0 -0
  199. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IReady.py +0 -0
  200. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IRoof.py +0 -0
  201. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IRotation.py +0 -0
  202. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IRunnable.py +0 -0
  203. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IRunning.py +0 -0
  204. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IScriptRunner.py +0 -0
  205. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/ISpectrograph.py +0 -0
  206. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IStartStop.py +0 -0
  207. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IStructuredConfig.py +0 -0
  208. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/ISyncTarget.py +0 -0
  209. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/ITelescope.py +0 -0
  210. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/ITemperatures.py +0 -0
  211. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/ITrackingMode.py +0 -0
  212. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/ITrackingRate.py +0 -0
  213. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IVideo.py +0 -0
  214. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IWeather.py +0 -0
  215. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/IWindow.py +0 -0
  216. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/__init__.py +0 -0
  217. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/interfaces/interface.py +0 -0
  218. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/mixins/__init__.py +0 -0
  219. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/__init__.py +0 -0
  220. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/camera/__init__.py +0 -0
  221. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/camera/adaptive.py +0 -0
  222. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/camera/dummycamera.py +0 -0
  223. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/camera/dummyspectrograph.py +0 -0
  224. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/camera/dummyvideo.py +0 -0
  225. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/flatfield/__init__.py +0 -0
  226. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/flatfield/flatfield.py +0 -0
  227. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/flatfield/pointing.py +0 -0
  228. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/flatfield/scheduler.py +0 -0
  229. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/focus/__init__.py +0 -0
  230. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/focus/dummyautofocus.py +0 -0
  231. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/focus/focusmodel.py +0 -0
  232. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/image/__init__.py +0 -0
  233. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/image/imagewatcher.py +0 -0
  234. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/image/imagewriter.py +0 -0
  235. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/image/seeing.py +0 -0
  236. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/module.py +0 -0
  237. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/pointing/__init__.py +0 -0
  238. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/pointing/_baseguiding.py +0 -0
  239. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/pointing/dummyacquisition.py +0 -0
  240. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/pointing/dummyguiding.py +0 -0
  241. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/pointing/guidingstatistics/__init__.py +0 -0
  242. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/pointing/guidingstatistics/guidingstatistics.py +0 -0
  243. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/pointing/guidingstatistics/pixeloffset.py +0 -0
  244. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/pointing/guidingstatistics/skyoffsets.py +0 -0
  245. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/pointing/guidingstatistics/uptime.py +0 -0
  246. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/pointing/scienceframeguiding.py +0 -0
  247. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/robotic/__init__.py +0 -0
  248. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/robotic/mastermind.py +0 -0
  249. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/robotic/pointing.py +0 -0
  250. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/robotic/scriptrunner.py +0 -0
  251. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/roof/__init__.py +0 -0
  252. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/roof/basedome.py +0 -0
  253. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/roof/dummyroof.py +0 -0
  254. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/telescope/__init__.py +0 -0
  255. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/telescope/dummyaltaztelescope.py +0 -0
  256. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/telescope/dummyradectelescope.py +0 -0
  257. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/telescope/dummysolartelescope.py +0 -0
  258. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/test/__init__.py +0 -0
  259. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/test/standalone.py +0 -0
  260. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/utils/__init__.py +0 -0
  261. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/utils/fluentlogger.py +0 -0
  262. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/utils/httpfilecache.py +0 -0
  263. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/utils/kiosk.py +0 -0
  264. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/utils/matrix.py +0 -0
  265. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/utils/stellarium.py +0 -0
  266. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/utils/telegram.py +0 -0
  267. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/utils/trigger.py +0 -0
  268. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/weather/__init__.py +0 -0
  269. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/weather/mockweather.py +0 -0
  270. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/weather/weather.py +0 -0
  271. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/weather/weather_api.py +0 -0
  272. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/modules/weather/weather_state.py +0 -0
  273. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/py.typed +0 -0
  274. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/__init__.py +0 -0
  275. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/observation.py +0 -0
  276. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/__init__.py +0 -0
  277. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/_executor.py +0 -0
  278. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/astroplanscheduler.py +0 -0
  279. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/constraints/__init__.py +0 -0
  280. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/constraints/airmassconstraint.py +0 -0
  281. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/constraints/constraint.py +0 -0
  282. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/constraints/moonilluminationconstraint.py +0 -0
  283. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/constraints/moonseparationconstraint.py +0 -0
  284. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/constraints/solarelevationconstraint.py +0 -0
  285. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/constraints/timeconstraint.py +0 -0
  286. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/dataprovider.py +0 -0
  287. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/merits/__init__.py +0 -0
  288. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/merits/aftertime.py +0 -0
  289. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/merits/beforetime.py +0 -0
  290. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/merits/constant.py +0 -0
  291. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/merits/follow.py +0 -0
  292. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/merits/interval.py +0 -0
  293. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/merits/merit.py +0 -0
  294. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/merits/pernight.py +0 -0
  295. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/merits/random.py +0 -0
  296. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/merits/timewindow.py +0 -0
  297. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/merits/transit.py +0 -0
  298. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/observationarchiveevolution.py +0 -0
  299. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/ondemandscheduler.py +0 -0
  300. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/targets/__init__.py +0 -0
  301. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/targets/dynamictarget.py +0 -0
  302. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/targets/heliocentricpolartarget.py +0 -0
  303. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/targets/helioprojectivetarget.py +0 -0
  304. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/targets/picker/__init__.py +0 -0
  305. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/targets/picker/csvpicker.py +0 -0
  306. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/targets/picker/picker.py +0 -0
  307. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/targets/siderealtarget.py +0 -0
  308. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/targets/target.py +0 -0
  309. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scheduler/taskscheduler.py +0 -0
  310. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scripts/__init__.py +0 -0
  311. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scripts/calibration/__init__.py +0 -0
  312. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scripts/calibration/darkbias.py +0 -0
  313. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scripts/calibration/pointing.py +0 -0
  314. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scripts/calibration/skyflats.py +0 -0
  315. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scripts/control/__init__.py +0 -0
  316. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scripts/control/cases.py +0 -0
  317. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scripts/control/conditional.py +0 -0
  318. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scripts/control/parallel.py +0 -0
  319. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scripts/control/selector.py +0 -0
  320. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scripts/control/sequential.py +0 -0
  321. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scripts/exceptions.py +0 -0
  322. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scripts/imaging/__init__.py +0 -0
  323. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scripts/imaging/autofocus.py +0 -0
  324. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scripts/imaging/imaging.py +0 -0
  325. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scripts/imaging/transitimaging.py +0 -0
  326. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scripts/script.py +0 -0
  327. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scripts/utils/__init__.py +0 -0
  328. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scripts/utils/callmodule.py +0 -0
  329. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scripts/utils/debugtrigger.py +0 -0
  330. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/scripts/utils/log.py +0 -0
  331. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/storage/__init__.py +0 -0
  332. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/storage/backend/__init__.py +0 -0
  333. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/storage/backend/observationarchive.py +0 -0
  334. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/storage/backend/taskarchive.py +0 -0
  335. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/storage/filesystem/__init__.py +0 -0
  336. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/storage/filesystem/observationarchive.py +0 -0
  337. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/storage/filesystem/taskarchive.py +0 -0
  338. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/storage/lco/__init__.py +0 -0
  339. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/storage/lco/_portal.py +0 -0
  340. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/storage/lco/_schedulereader.py +0 -0
  341. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/storage/lco/_schedulewriter.py +0 -0
  342. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/storage/lco/configdb.py +0 -0
  343. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/storage/lco/mockobservationarchive.py +0 -0
  344. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/storage/lco/observationarchive.py +0 -0
  345. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/storage/lco/scripts/__init__.py +0 -0
  346. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/storage/lco/scripts/autofocus.py +0 -0
  347. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/storage/lco/scripts/default.py +0 -0
  348. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/storage/lco/scripts/script.py +0 -0
  349. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/storage/lco/task.py +0 -0
  350. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/storage/lco/taskarchive.py +0 -0
  351. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/storage/lco/taskrunner.py +0 -0
  352. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/storage/memory/__init__.py +0 -0
  353. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/storage/memory/observationarchive.py +0 -0
  354. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/storage/memory/taskarchive.py +0 -0
  355. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/storage/observationarchive.py +0 -0
  356. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/storage/taskarchive.py +0 -0
  357. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/task.py +0 -0
  358. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/taskrunner.py +0 -0
  359. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/utils/__init__.py +0 -0
  360. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/utils/archive/__init__.py +0 -0
  361. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/utils/archive/archive.py +0 -0
  362. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/utils/archive/local_archive.py +0 -0
  363. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/utils/archive/pyobs_archive.py +0 -0
  364. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/utils/exptime/__init__.py +0 -0
  365. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/utils/exptime/exptime.py +0 -0
  366. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/utils/exptime/stellarexptime.py +0 -0
  367. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/utils/skyflats/__init__.py +0 -0
  368. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/utils/skyflats/exptimeeval.py +0 -0
  369. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/utils/skyflats/flatfielder.py +0 -0
  370. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/utils/skyflats/pointing/__init__.py +0 -0
  371. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/utils/skyflats/pointing/base.py +0 -0
  372. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/utils/skyflats/pointing/static.py +0 -0
  373. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/utils/skyflats/priorities/__init__.py +0 -0
  374. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/utils/skyflats/priorities/archive.py +0 -0
  375. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/utils/skyflats/priorities/base.py +0 -0
  376. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/utils/skyflats/priorities/const.py +0 -0
  377. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/robotic/utils/skyflats/scheduler.py +0 -0
  378. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/__init__.py +0 -0
  379. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/average.py +0 -0
  380. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/cache.py +0 -0
  381. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/config.py +0 -0
  382. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/config_schema.py +0 -0
  383. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/coordinates.py +0 -0
  384. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/curvefit.py +0 -0
  385. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/enums.py +0 -0
  386. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/exceptions.py +0 -0
  387. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/fits.py +0 -0
  388. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/focusseries/__init__.py +0 -0
  389. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/focusseries/base.py +0 -0
  390. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/focusseries/photometry.py +0 -0
  391. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/focusseries/projection.py +0 -0
  392. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/grids/__init__.py +0 -0
  393. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/grids/filters.py +0 -0
  394. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/grids/grid.py +0 -0
  395. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/grids/gridnode.py +0 -0
  396. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/grids/pipeline.py +0 -0
  397. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/gui/__init__.py +0 -0
  398. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/gui/camera/__init__.py +0 -0
  399. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/gui/camera/binningwidget.py +0 -0
  400. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/gui/camera/datadisplaywidget.py +0 -0
  401. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/gui/camera/exposewidget.py +0 -0
  402. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/gui/camera/exposuretimewidget.py +0 -0
  403. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/gui/camera/imageformatwidget.py +0 -0
  404. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/gui/camera/listpickerdialog.py +0 -0
  405. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/http.py +0 -0
  406. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/influxdb.py +0 -0
  407. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/logger.py +0 -0
  408. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/logging/__init__.py +0 -0
  409. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/logging/context.py +0 -0
  410. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/logging/resolvableerror.py +0 -0
  411. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/modulegui.py +0 -0
  412. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/offsets/__init__.py +0 -0
  413. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/offsets/applyaltazoffsets.py +0 -0
  414. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/offsets/applyoffsets.py +0 -0
  415. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/offsets/applyradecoffsets.py +0 -0
  416. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/parallel.py +0 -0
  417. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/pipeline/__init__.py +0 -0
  418. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/pipeline/progress.py +0 -0
  419. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/pipeline/reduction.py +0 -0
  420. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/pipeline/reduction_base.py +0 -0
  421. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/publisher/__init__.py +0 -0
  422. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/publisher/csv.py +0 -0
  423. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/publisher/http.py +0 -0
  424. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/publisher/log.py +0 -0
  425. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/publisher/multi.py +0 -0
  426. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/publisher/publisher.py +0 -0
  427. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/serialization.py +0 -0
  428. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/shellcommand.py +0 -0
  429. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/threads/__init__.py +0 -0
  430. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/threads/lockwithabort.py +0 -0
  431. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/time.py +0 -0
  432. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/units.py +0 -0
  433. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/utils/versions.py +0 -0
  434. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/version.py +0 -0
  435. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/vfs/__init__.py +0 -0
  436. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/vfs/archivefile.py +0 -0
  437. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/vfs/bufferedfile.py +0 -0
  438. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/vfs/file.py +0 -0
  439. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/vfs/filelists/__init__.py +0 -0
  440. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/vfs/filelists/filelist.py +0 -0
  441. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/vfs/filelists/testing.py +0 -0
  442. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/vfs/httpfile.py +0 -0
  443. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/vfs/localfile.py +0 -0
  444. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/vfs/memfile.py +0 -0
  445. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/vfs/sftpfile.py +0 -0
  446. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/vfs/smbfile.py +0 -0
  447. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/vfs/sshfile.py +0 -0
  448. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/vfs/tempfile.py +0 -0
  449. {pyobs_core-2.0.0.dev80 → pyobs_core-2.0.0.dev82}/pyobs/vfs/vfs.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: pyobs-core
3
- Version: 2.0.0.dev80
3
+ Version: 2.0.0.dev82
4
4
  Summary: robotic telescope software
5
5
  Author-email: Tim-Oliver Husser <thusser@uni-goettingen.de>
6
6
  License-Expression: MIT
@@ -35,6 +35,8 @@ class CameraSettingsMixin:
35
35
  self.__camerasettings_filter = filter_name
36
36
  self.__camerasettings_binning = binning
37
37
 
38
+ super().__init__(**kwargs)
39
+
38
40
  async def _do_camera_settings(self, camera: Module | IData | IFilters | IBinning | IWindow) -> None:
39
41
  """Do camera settings for given camera."""
40
42
 
@@ -46,8 +46,6 @@ class FitsHeaderMixin:
46
46
  them. A peer that never answers (e.g. a laptop put to sleep without closing its
47
47
  client) would otherwise stall the frame for the full XMPP IQ timeout.
48
48
  """
49
- module = cast(Module, self)
50
-
51
49
  # store
52
50
  self._fitsheadermixin_fits_namespaces = fits_namespaces
53
51
  self._fitsheadermixin_filename_pattern = filenames
@@ -58,10 +56,19 @@ class FitsHeaderMixin:
58
56
  self._fitsheadermixin_night_obs = night_obs
59
57
 
60
58
  # night exposure number
61
- self._fitsheadermixin_cache = f"/pyobs/modules/{module.name}/cache.yaml"
62
59
  self._fitsheadermixin_enable_frame_number = frame_number
63
60
  self._fitsheadermixin_frame_number = 0
64
61
 
62
+ super().__init__(**kwargs)
63
+
64
+ @property
65
+ def _fitsheadermixin_cache(self) -> str:
66
+ # computed lazily (not cached at __init__ time) since it depends on module.name, which in
67
+ # turn depends on comm having been set up by Object.__init__ -- in a cooperative super()
68
+ # chain, this mixin's __init__ can run before Module has finished its own setup
69
+ module = cast(Module, self)
70
+ return f"/pyobs/modules/{module.name}/cache.yaml"
71
+
65
72
  async def request_fits_headers(self, before: bool = True) -> dict[str, Task[Any]]:
66
73
  """Request FITS headers from other modules.
67
74
 
@@ -309,7 +316,7 @@ class ImageFitsHeaderMixin(FitsHeaderMixin):
309
316
  rotation: Rotation east of north.
310
317
  filename: Filename pattern for FITS images.
311
318
  """
312
- FitsHeaderMixin.__init__(self, **kwargs)
319
+ super().__init__(**kwargs)
313
320
 
314
321
  # store
315
322
  self._fitsheadermixin_centre = centre
@@ -15,6 +15,7 @@ class FitsNamespaceMixin:
15
15
 
16
16
  def __init__(self, fits_namespaces: dict[str, list[str]] | None = None, **kwargs: Any):
17
17
  self.__namespaces = {} if fits_namespaces is None else fits_namespaces
18
+ super().__init__(**kwargs)
18
19
 
19
20
  def _filter_fits_namespace(
20
21
  self, hdr: dict[str, FitsHeaderEntry], sender: str, namespaces: list[str] | None = None, **kwargs: Any
@@ -125,6 +125,8 @@ class FollowMixin:
125
125
  if not isinstance(self, self.__follow_mode):
126
126
  raise ValueError(f"This module is not of given mode {mode}.")
127
127
 
128
+ super().__init__(*args, **kwargs)
129
+
128
130
  @property
129
131
  def is_following(self) -> bool:
130
132
  """Returns True, if we're following another device."""
@@ -26,6 +26,8 @@ class MotionStatusMixin:
26
26
  self.__motion_status = MotionStatus.UNKNOWN
27
27
  self.__motion_status_single = {i: MotionStatus.UNKNOWN for i in self.__motion_status_interfaces}
28
28
 
29
+ super().__init__(**kwargs)
30
+
29
31
  async def open(self) -> None:
30
32
  # subscribe to events
31
33
  if isinstance(self, Module) and self._comm:
@@ -1,10 +1,11 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import inspect
3
4
  import logging
4
5
  from typing import TYPE_CHECKING, Any
5
6
 
6
7
  from pyobs.images import Image, ImageProcessor
7
- from pyobs.object import Object
8
+ from pyobs.object import Object, get_class_from_string
8
9
  from pyobs.utils.exceptions import ImageError
9
10
 
10
11
  if TYPE_CHECKING:
@@ -31,9 +32,10 @@ class PipelineMixin:
31
32
  archive: Default archive config/object for steps that accept one (e.g.
32
33
  Calibration) and don't already specify their own -- lets a pipeline's
33
34
  steps share the archive it was itself given, instead of repeating the
34
- same archive config in every step that needs one. Steps that don't
35
- declare an archive parameter just absorb and drop it via their own
36
- **kwargs, the same as any other unrecognized Object kwarg.
35
+ same archive config in every step that needs one. Only injected into a
36
+ step's config if that step's class actually declares an `archive`
37
+ parameter (checked via signature inspection); steps that don't declare
38
+ one never receive it, rather than receiving-then-silently-dropping it.
37
39
  """
38
40
 
39
41
  # store
@@ -46,11 +48,38 @@ class PipelineMixin:
46
48
  else:
47
49
  raise ValueError("This class is no Object.")
48
50
 
51
+ super().__init__(**kwargs)
52
+
53
+ @staticmethod
54
+ def _accepts_archive(class_name: str) -> bool:
55
+ """Whether the given class declares an `archive` parameter anywhere in its `__init__` MRO."""
56
+ try:
57
+ klass = get_class_from_string(class_name)
58
+ except Exception:
59
+ return False
60
+ for cls in klass.__mro__:
61
+ init = cls.__dict__.get("__init__")
62
+ if init is None:
63
+ continue
64
+ try:
65
+ sig = inspect.signature(init)
66
+ except (TypeError, ValueError):
67
+ continue
68
+ if "archive" in sig.parameters:
69
+ return True
70
+ return False
71
+
49
72
  @staticmethod
50
73
  def _with_default_archive(
51
74
  step: dict[str, Any] | ImageProcessor, archive: dict[str, Any] | Archive | None
52
75
  ) -> dict[str, Any] | ImageProcessor:
53
- if archive is not None and isinstance(step, dict) and "archive" not in step:
76
+ if (
77
+ archive is not None
78
+ and isinstance(step, dict)
79
+ and "archive" not in step
80
+ and "class" in step
81
+ and PipelineMixin._accepts_archive(step["class"])
82
+ ):
54
83
  return {**step, "archive": archive}
55
84
  return step
56
85
 
@@ -42,6 +42,8 @@ class WaitForMotionMixin:
42
42
  )
43
43
  self.__wait_for_timeout = wait_for_timeout
44
44
 
45
+ super().__init__(**kwargs)
46
+
45
47
  async def _wait_for_motion(self, abort: Event) -> None:
46
48
  """Wait until all devices are in one of the given motion states.
47
49
 
@@ -33,6 +33,8 @@ class WeatherAwareMixin:
33
33
  else:
34
34
  raise ValueError("This is not a module.")
35
35
 
36
+ super().__init__(**kwargs)
37
+
36
38
  async def open(self) -> None:
37
39
  """Open mixin."""
38
40
  # subscribe to events
@@ -76,15 +76,14 @@ class BaseCamera(
76
76
  fits_namespaces: List of namespaces for FITS headers that this camera should request
77
77
  fits_header_timeout: Maximum seconds to wait for a peer's FITS headers before skipping them.
78
78
  """
79
- Module.__init__(self, **kwargs)
80
- ImageFitsHeaderMixin.__init__(
81
- self,
79
+ super().__init__(
82
80
  fits_namespaces=fits_namespaces,
83
81
  fits_headers=fits_headers,
84
82
  centre=centre,
85
83
  rotation=rotation,
86
84
  filenames=filenames,
87
85
  fits_header_timeout=fits_header_timeout,
86
+ **kwargs,
88
87
  )
89
88
 
90
89
  # check
@@ -44,10 +44,7 @@ class BaseSpectrograph(Module, SpectrumFitsHeaderMixin, ISpectrograph, IExposure
44
44
  filenames: Template for file naming.
45
45
  fits_namespaces: List of namespaces for FITS headers that this camera should request
46
46
  """
47
- Module.__init__(self, **kwargs)
48
- SpectrumFitsHeaderMixin.__init__(
49
- self, fits_namespaces=fits_namespaces, fits_headers=fits_headers, filenames=filenames, **kwargs
50
- )
47
+ super().__init__(fits_namespaces=fits_namespaces, fits_headers=fits_headers, filenames=filenames, **kwargs)
51
48
 
52
49
  # init camera
53
50
  self._exposure: ExposureInfo | None = None
@@ -113,15 +113,14 @@ class BaseVideo(Module, ImageFitsHeaderMixin, IVideo, IImageType, metaclass=ABCM
113
113
  sleep_time: Time in s with inactivity after which the camera should go to sleep.
114
114
  fits_header_timeout: Maximum seconds to wait for a peer's FITS headers before skipping them.
115
115
  """
116
- Module.__init__(self, **kwargs)
117
- ImageFitsHeaderMixin.__init__(
118
- self,
116
+ super().__init__(
119
117
  fits_namespaces=fits_namespaces,
120
118
  fits_headers=fits_headers,
121
119
  centre=centre,
122
120
  rotation=rotation,
123
121
  filenames=filenames,
124
122
  fits_header_timeout=fits_header_timeout,
123
+ **kwargs,
125
124
  )
126
125
 
127
126
  # store
@@ -20,9 +20,7 @@ class PipelineCamera(Module, ICamera, ImageFitsHeaderMixin, PipelineMixin):
20
20
 
21
21
  def __init__(self, **kwargs: Any):
22
22
  """Creates a new pipeline cammera."""
23
- Module.__init__(self, **kwargs)
24
- PipelineMixin.__init__(self, **kwargs)
25
- ImageFitsHeaderMixin.__init__(self, **kwargs)
23
+ super().__init__(**kwargs)
26
24
 
27
25
  async def grab_data(self, broadcast: bool = True, **kwargs: Any) -> str:
28
26
  """Grabs an image and returns reference.
@@ -58,7 +58,7 @@ class AutoFocusSeries(Module, CameraSettingsMixin, IAutoFocus):
58
58
  broadcast: Whether to broadcast focus series images.
59
59
  final_image: Whether to take final image with optimal focus, which is always broadcasted.
60
60
  """
61
- Module.__init__(self, **kwargs)
61
+ super().__init__(filters=filters, filter_name=filter_name, binning=binning, **kwargs)
62
62
 
63
63
  # store focuser and camera
64
64
  self._focuser = focuser
@@ -74,9 +74,6 @@ class AutoFocusSeries(Module, CameraSettingsMixin, IAutoFocus):
74
74
  # create focus series
75
75
  self._series: FocusSeries = get_object(series, FocusSeries)
76
76
 
77
- # init camera settings mixin
78
- CameraSettingsMixin.__init__(self, filters=filters, filter_name=filter_name, binning=binning, **kwargs)
79
-
80
77
  # register exceptions
81
78
  if isinstance(camera, str):
82
79
  self._register_exception(
@@ -29,8 +29,7 @@ class Pipeline(Module, PipelineMixin):
29
29
  sources: List of sources to process images from.
30
30
  interval: Interval in seconds for automatic run of pipeline.
31
31
  """
32
- Module.__init__(self, **kwargs)
33
- PipelineMixin.__init__(self, pipeline)
32
+ super().__init__(steps=pipeline, **kwargs)
34
33
 
35
34
  # only allow one option!
36
35
  if (sources is not None and interval is not None) or (sources is None and interval is None):
@@ -34,11 +34,8 @@ class BasePointing(Module, PipelineMixin, metaclass=ABCMeta):
34
34
  telescope: Telescope to use.
35
35
  pipeline: Pipeline steps to run on new image. MUST include a step calculating offsets!
36
36
  apply: Object that handles applying offsets to telescope.
37
- log_file: Name of file to write log to.
38
- log_absolute: Log absolute offsets instead of relative ones to last one.
39
37
  """
40
- Module.__init__(self, **kwargs)
41
- PipelineMixin.__init__(self, pipeline)
38
+ super().__init__(steps=pipeline, **kwargs)
42
39
 
43
40
  # store
44
41
  self._camera = camera
@@ -75,7 +75,7 @@ class Acquisition(BasePointing, CameraSettingsMixin, IAcquisition):
75
75
  successful or not.
76
76
  broadcast: Whether to broadcast acquisition images.
77
77
  """
78
- BasePointing.__init__(self, **kwargs)
78
+ super().__init__(**kwargs)
79
79
 
80
80
  # store
81
81
  self._default_exposure_time = exposure_time
@@ -92,9 +92,6 @@ class Acquisition(BasePointing, CameraSettingsMixin, IAcquisition):
92
92
  # init log file
93
93
  self._publisher = CsvPublisher(log_file) if log_file is not None else None
94
94
 
95
- # init camera settings mixin
96
- CameraSettingsMixin.__init__(self, **kwargs)
97
-
98
95
  async def open(self) -> None:
99
96
  """Open module"""
100
97
  await Module.open(self)
@@ -27,7 +27,7 @@ class AutoGuiding(BaseGuiding, CameraSettingsMixin):
27
27
  exposure_time: Initial exposure time in seconds.
28
28
  broadcast: Whether to broadcast new images.
29
29
  """
30
- BaseGuiding.__init__(self, **kwargs)
30
+ super().__init__(**kwargs)
31
31
 
32
32
  # store
33
33
  self._default_exposure_time = exposure_time
@@ -35,9 +35,6 @@ class AutoGuiding(BaseGuiding, CameraSettingsMixin):
35
35
  self._broadcast = broadcast
36
36
  self._source_detection = SepSourceDetection()
37
37
 
38
- # init camera settings mixin
39
- CameraSettingsMixin.__init__(self, **kwargs)
40
-
41
38
  # add thread func
42
39
  self.add_background_task(self._auto_guiding)
43
40
 
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import asyncio
4
+ import inspect
4
5
  import json
5
6
  import logging
6
7
  import time
@@ -19,6 +20,7 @@ from pyobs.events import (
19
20
  from pyobs.interfaces import IRunnable, IRunning, IStartStop
20
21
  from pyobs.interfaces.IRunning import RunningState
21
22
  from pyobs.modules import Module
23
+ from pyobs.object import get_class_from_string
22
24
  from pyobs.robotic import (
23
25
  ObservationArchive,
24
26
  ObservationList,
@@ -32,6 +34,38 @@ from pyobs.utils.time import Time
32
34
  log = logging.getLogger(__name__)
33
35
 
34
36
 
37
+ def _class_accepts_param(config: dict[str, Any] | Any, param_name: str) -> bool:
38
+ """Whether the class configured in `config` (a dict with a "class" key, or an already-built
39
+ object) declares `param_name` somewhere in its __init__ MRO.
40
+
41
+ Used to decide whether a kwarg can be injected into a child object's config -- injecting
42
+ unconditionally relies on the target silently absorbing it if unwanted, which no longer
43
+ happens now that Object.__init__ forwards leftover kwargs on to object.__init__().
44
+ """
45
+ if isinstance(config, dict):
46
+ if "class" not in config:
47
+ return False
48
+ try:
49
+ klass = get_class_from_string(config["class"])
50
+ except Exception:
51
+ return False
52
+ elif isinstance(config, type):
53
+ klass = config
54
+ else:
55
+ klass = type(config)
56
+ for cls in klass.__mro__:
57
+ init = cls.__dict__.get("__init__")
58
+ if init is None:
59
+ continue
60
+ try:
61
+ sig = inspect.signature(init)
62
+ except (TypeError, ValueError):
63
+ continue
64
+ if param_name in sig.parameters:
65
+ return True
66
+ return False
67
+
68
+
35
69
  class Scheduler(Module, IStartStop, IRunnable):
36
70
  """Scheduler."""
37
71
 
@@ -68,8 +102,18 @@ class Scheduler(Module, IStartStop, IRunnable):
68
102
 
69
103
  # get scheduler
70
104
  self._task_archive = self.add_child_object(tasks, TaskArchive, on_tasks_changed=self._update_schedule)
71
- self._schedule = self.add_child_object(schedule, ObservationArchive, auto_update=False)
72
- self._scheduler = self.add_child_object(scheduler, TaskScheduler, observation_archive=self._schedule)
105
+ # BackendObservationArchive declares auto_update and gates its own polling loop on it --
106
+ # since we already drive updates via on_tasks_changed above, that poller must stay off.
107
+ # Other ObservationArchive implementations (e.g. LcoObservationArchive) don't declare it at
108
+ # all, so it must not be injected unconditionally.
109
+ extra_schedule_kwargs: dict[str, Any] = {}
110
+ if _class_accepts_param(schedule, "auto_update"):
111
+ extra_schedule_kwargs["auto_update"] = False
112
+ self._schedule = self.add_child_object(schedule, ObservationArchive, **extra_schedule_kwargs)
113
+ extra_scheduler_kwargs: dict[str, Any] = {}
114
+ if _class_accepts_param(scheduler, "observation_archive"):
115
+ extra_scheduler_kwargs["observation_archive"] = self._schedule
116
+ self._scheduler = self.add_child_object(scheduler, TaskScheduler, **extra_scheduler_kwargs)
73
117
 
74
118
  # store
75
119
  self._running = True
@@ -12,17 +12,14 @@ from pyobs.utils.enums import MotionStatus
12
12
  log = logging.getLogger(__name__)
13
13
 
14
14
 
15
- class BaseRoof(WeatherAwareMixin, MotionStatusMixin, IRoof, IFitsHeaderBefore, Module, metaclass=ABCMeta):
15
+ class BaseRoof(Module, WeatherAwareMixin, MotionStatusMixin, IRoof, IFitsHeaderBefore, metaclass=ABCMeta):
16
16
  """Base class for roofs."""
17
17
 
18
18
  __module__ = "pyobs.modules.roof"
19
19
 
20
20
  def __init__(self, **kwargs: Any):
21
21
  """Initialize a new base roof."""
22
- Module.__init__(self, **kwargs)
23
-
24
- WeatherAwareMixin.__init__(self, **kwargs)
25
- MotionStatusMixin.__init__(self, **kwargs)
22
+ super().__init__(**kwargs)
26
23
 
27
24
  async def open(self) -> None:
28
25
  """Open module."""
@@ -94,8 +94,7 @@ class _DummyTelescopeBase(
94
94
  focal_length: Focal length in mm.
95
95
  wait_secs: Wait time between slew checks in seconds.
96
96
  """
97
- BaseTelescope.__init__(self, **kwargs, motion_status_interfaces=["ITelescope", "IFocuser", "IFilters"])
98
- FitsNamespaceMixin.__init__(self, **kwargs)
97
+ super().__init__(motion_status_interfaces=["ITelescope", "IFocuser", "IFilters"], **kwargs)
99
98
 
100
99
  # telescope state
101
100
  self._position = (
@@ -221,7 +221,7 @@ def _ra_rate_on_sky(ra1_deg: float, ra2_deg: float, dec_deg: float, dt_seconds:
221
221
 
222
222
 
223
223
  class BaseTelescope(
224
- WeatherAwareMixin, MotionStatusMixin, WaitForMotionMixin, ITelescope, IFitsHeaderBefore, Module, metaclass=ABCMeta
224
+ Module, WeatherAwareMixin, MotionStatusMixin, WaitForMotionMixin, ITelescope, IFitsHeaderBefore, metaclass=ABCMeta
225
225
  ):
226
226
  """Base class for telescopes."""
227
227
 
@@ -241,7 +241,16 @@ class BaseTelescope(
241
241
  min_altitude: Minimal altitude for telescope.
242
242
  wait_for_dome: Name of dome module to wait for.
243
243
  """
244
- Module.__init__(self, **kwargs)
244
+ # wait_for_dome is BaseTelescope's own param, but WaitForMotionMixin (further down the
245
+ # cooperative chain) needs it translated into its own wait_for_modules/wait_for_timeout/
246
+ # wait_for_states shape -- computed here and threaded through the single super() call,
247
+ # since WaitForMotionMixin has no way to see wait_for_dome itself.
248
+ super().__init__(
249
+ wait_for_modules=None if wait_for_dome is None else [wait_for_dome],
250
+ wait_for_timeout=60000,
251
+ wait_for_states=[MotionStatus.POSITIONED, MotionStatus.TRACKING],
252
+ **kwargs,
253
+ )
245
254
 
246
255
  # store
247
256
  self._fits_headers = fits_headers if fits_headers is not None else {}
@@ -265,16 +274,6 @@ class BaseTelescope(
265
274
  self.add_background_task(self._celestial, True)
266
275
  self.add_background_task(self._track_refresh, True)
267
276
 
268
- # init mixins
269
- WeatherAwareMixin.__init__(self, **kwargs)
270
- MotionStatusMixin.__init__(self, **kwargs)
271
- WaitForMotionMixin.__init__(
272
- self,
273
- wait_for_modules=None if wait_for_dome is None else [wait_for_dome],
274
- wait_for_timeout=60000,
275
- wait_for_states=[MotionStatus.POSITIONED, MotionStatus.TRACKING],
276
- )
277
-
278
277
  # register exception
279
278
  self._register_exception(exc.MotionError, 3, timespan=600, callback=self._default_remote_error_callback)
280
279
 
@@ -14,15 +14,14 @@ from pyobs.utils.enums import MotionStatus
14
14
  log = logging.getLogger(__name__)
15
15
 
16
16
 
17
- class DummyMode(MotionStatusMixin, Module, IMode, IMotion):
17
+ class DummyMode(Module, MotionStatusMixin, IMode, IMotion):
18
18
  """A dummy module for mode switching."""
19
19
 
20
20
  __module__ = "pyobs.modules.utils"
21
21
 
22
22
  def __init__(self, **kwargs: Any):
23
23
  """Initialize a new dummy module."""
24
- Module.__init__(self, **kwargs)
25
- MotionStatusMixin.__init__(self, **kwargs)
24
+ super().__init__(**kwargs)
26
25
 
27
26
  # modes
28
27
  self._mode_options = {
@@ -355,6 +355,11 @@ class Object(PrivateAttrMixin):
355
355
  # background tasks
356
356
  self._background_tasks: list[tuple[BackgroundTask, bool]] = []
357
357
 
358
+ # forward anything left to the next class in the MRO -- lets mixins listed after this
359
+ # one in a subclass's bases (e.g. WeatherAwareMixin, PipelineMixin) claim their own
360
+ # kwargs cooperatively, instead of Object silently absorbing them
361
+ super().__init__(**kwargs)
362
+
358
363
  def add_background_task(
359
364
  self, func: Callable[..., Coroutine[Any, Any, None]], restart: bool = True, autostart: bool = True
360
365
  ) -> BackgroundTask:
@@ -50,7 +50,7 @@ class WindowingWidget(QtWidgets.QGroupBox):
50
50
 
51
51
  @property
52
52
  def value_top(self) -> int:
53
- return self.spin_left.value()
53
+ return self.spin_top.value()
54
54
 
55
55
  @property
56
56
  def value_width(self) -> int:
@@ -36,8 +36,7 @@ class Pipeline(Object, PipelineMixin):
36
36
  Calibration) and don't already specify their own. See
37
37
  PipelineMixin.__init__.
38
38
  """
39
- Object.__init__(self, **kwargs)
40
- PipelineMixin.__init__(self, steps, archive=archive)
39
+ super().__init__(steps=steps, archive=archive, **kwargs)
41
40
 
42
41
  @staticmethod
43
42
  def _combine_calib_images(
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "pyobs-core"
3
- version = "2.0.0.dev80"
3
+ version = "2.0.0.dev82"
4
4
  description = "robotic telescope software"
5
5
  authors = [{ name = "Tim-Oliver Husser", email = "thusser@uni-goettingen.de" }]
6
6
  requires-python = ">=3.11"