pyobs-core 2.0.0.dev3__tar.gz → 2.0.0.dev5__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 (432) hide show
  1. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/PKG-INFO +1 -1
  2. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/comm.py +14 -18
  3. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/local/localcomm.py +1 -1
  4. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/proxy.py +14 -2
  5. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/xmpp/xmppcomm.py +5 -5
  6. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IBinning.py +15 -10
  7. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IConfig.py +7 -6
  8. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/ICooling.py +10 -7
  9. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IExposure.py +10 -7
  10. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IExposureTime.py +8 -5
  11. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IFilters.py +14 -9
  12. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IFocuser.py +9 -6
  13. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IGain.py +9 -6
  14. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IImageFormat.py +14 -9
  15. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IImageType.py +8 -5
  16. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IMode.py +14 -9
  17. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IModule.py +8 -5
  18. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IMotion.py +15 -11
  19. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IMultiFiber.py +17 -13
  20. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IOffsetsAltAz.py +9 -6
  21. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IOffsetsRaDec.py +9 -6
  22. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IPointingAltAz.py +9 -6
  23. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IPointingHGS.py +9 -6
  24. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IPointingHelioprojective.py +9 -6
  25. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IPointingRaDec.py +9 -6
  26. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IReady.py +8 -5
  27. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IRotation.py +8 -5
  28. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IRunning.py +8 -5
  29. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/ITemperatures.py +13 -11
  30. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IVideo.py +7 -4
  31. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IWindow.py +20 -12
  32. pyobs_core-2.0.0.dev5/pyobs/interfaces/__init__.py +151 -0
  33. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/interface.py +3 -0
  34. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/mixins/motionstatus.py +3 -3
  35. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/camera/basecamera.py +19 -9
  36. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/camera/basevideo.py +2 -2
  37. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/camera/dummycamera.py +52 -20
  38. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/camera/dummyvideo.py +3 -3
  39. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/flatfield/flatfield.py +16 -6
  40. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/module.py +6 -8
  41. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/pointing/autoguiding.py +2 -2
  42. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/roof/baseroof.py +2 -2
  43. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/telescope/dummytelescope.py +27 -16
  44. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/utils/dummymode.py +5 -5
  45. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyproject.toml +1 -1
  46. pyobs_core-2.0.0.dev3/pyobs/interfaces/__init__.py +0 -115
  47. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/.gitignore +0 -0
  48. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/LICENSE +0 -0
  49. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/__init__.py +0 -0
  50. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/application.py +0 -0
  51. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/background_task.py +0 -0
  52. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/cli/__init__.py +0 -0
  53. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/cli/_cli.py +0 -0
  54. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/cli/pyobs.py +0 -0
  55. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/cli/pyobsd.py +0 -0
  56. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/cli/pyobsw.py +0 -0
  57. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/__init__.py +0 -0
  58. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/commlogging.py +0 -0
  59. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/dummy/__init__.py +0 -0
  60. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/dummy/dummycomm.py +0 -0
  61. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/local/__init__.py +0 -0
  62. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/local/localnetwork.py +0 -0
  63. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/xmpp/__init__.py +0 -0
  64. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/xmpp/rpc.py +0 -0
  65. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/xmpp/serializer.py +0 -0
  66. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/xmpp/xep_0009/__init__.py +0 -0
  67. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/xmpp/xep_0009/binding.py +0 -0
  68. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/xmpp/xep_0009/rpc.py +0 -0
  69. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/xmpp/xep_0009_timeout/__init__.py +0 -0
  70. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/xmpp/xep_0009_timeout/rpc.py +0 -0
  71. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/xmpp/xep_0009_timeout/stanza/RPC.py +0 -0
  72. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/xmpp/xep_0009_timeout/stanza/__init__.py +0 -0
  73. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/xmpp/xmppclient.py +0 -0
  74. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/__init__.py +0 -0
  75. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/badweather.py +0 -0
  76. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/event.py +0 -0
  77. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/exposurestatuschanged.py +0 -0
  78. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/filterchanged.py +0 -0
  79. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/focusfound.py +0 -0
  80. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/goodweather.py +0 -0
  81. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/log.py +0 -0
  82. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/modechanged.py +0 -0
  83. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/moduleclosed.py +0 -0
  84. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/moduleopened.py +0 -0
  85. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/motionstatuschanged.py +0 -0
  86. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/move.py +0 -0
  87. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/newimage.py +0 -0
  88. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/newspectrum.py +0 -0
  89. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/offsets.py +0 -0
  90. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/roofclosing.py +0 -0
  91. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/roofopened.py +0 -0
  92. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/taskfailed.py +0 -0
  93. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/taskfinished.py +0 -0
  94. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/taskstarted.py +0 -0
  95. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/testevent.py +0 -0
  96. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/__init__.py +0 -0
  97. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/image.py +0 -0
  98. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/meta/__init__.py +0 -0
  99. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/meta/altazoffsets.py +0 -0
  100. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/meta/exptime.py +0 -0
  101. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/meta/genericoffset.py +0 -0
  102. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/meta/onskydistance.py +0 -0
  103. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/meta/pixeloffsets.py +0 -0
  104. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/meta/radecoffsets.py +0 -0
  105. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/meta/skyoffsets.py +0 -0
  106. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processor.py +0 -0
  107. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/__init__.py +0 -0
  108. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/_daobackgroundremover.py +0 -0
  109. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/annotation/__init__.py +0 -0
  110. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/annotation/_pillow.py +0 -0
  111. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/annotation/circle.py +0 -0
  112. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/annotation/crosshair.py +0 -0
  113. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/annotation/text.py +0 -0
  114. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/astrometry/__init__.py +0 -0
  115. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/astrometry/_dotnet_request.py +0 -0
  116. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/astrometry/_dotnet_request_builder.py +0 -0
  117. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/astrometry/_dotnet_request_logger.py +0 -0
  118. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/astrometry/_dotnet_response_saver.py +0 -0
  119. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/astrometry/astrometry.py +0 -0
  120. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/astrometry/dotnet.py +0 -0
  121. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/calibration/__init__.py +0 -0
  122. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/calibration/_calibration_cache.py +0 -0
  123. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/calibration/_ccddata_calibrator.py +0 -0
  124. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/calibration/calibration.py +0 -0
  125. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/detection/__init__.py +0 -0
  126. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/detection/_pysep_stats_calculator.py +0 -0
  127. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/detection/_source_catalog.py +0 -0
  128. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/detection/daophot.py +0 -0
  129. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/detection/pysep.py +0 -0
  130. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/detection/simpledisk.py +0 -0
  131. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/detection/sourcedetection.py +0 -0
  132. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/exptime/__init__.py +0 -0
  133. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/exptime/exptime.py +0 -0
  134. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/exptime/star.py +0 -0
  135. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/image/__init__.py +0 -0
  136. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/image/addfitsheaders.py +0 -0
  137. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/image/download.py +0 -0
  138. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/image/flip.py +0 -0
  139. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/image/grayscale.py +0 -0
  140. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/image/httpserver.py +0 -0
  141. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/image/normalize.py +0 -0
  142. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/image/save.py +0 -0
  143. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/image/saveimage.py +0 -0
  144. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/image/smooth.py +0 -0
  145. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/image/softbin.py +0 -0
  146. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/misc/__init__.py +0 -0
  147. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/misc/addmask.py +0 -0
  148. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/misc/catalogcircularmask.py +0 -0
  149. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/misc/circularmask.py +0 -0
  150. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/misc/createfilename.py +0 -0
  151. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/misc/imagesourcefilter.py +0 -0
  152. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/misc/removebackground.py +0 -0
  153. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/modules/__init__.py +0 -0
  154. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/modules/getfitsheaders.py +0 -0
  155. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/offsets/__init__.py +0 -0
  156. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/offsets/astrometry.py +0 -0
  157. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/offsets/brighteststar.py +0 -0
  158. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/offsets/brighteststar_guiding.py +0 -0
  159. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/offsets/dummyoffsets.py +0 -0
  160. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/offsets/dummyskyoffsets.py +0 -0
  161. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/offsets/fitsheader.py +0 -0
  162. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/offsets/offsets.py +0 -0
  163. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/offsets/pixeloffsets.py +0 -0
  164. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/offsets/projected.py +0 -0
  165. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/offsets/spilled_light.py +0 -0
  166. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/photometry/__init__.py +0 -0
  167. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/photometry/_photometry_calculator.py +0 -0
  168. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/photometry/_photutil_aperture_photometry.py +0 -0
  169. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/photometry/_sep_aperture_photometry.py +0 -0
  170. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/photometry/aperture_photometry.py +0 -0
  171. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/photometry/photometry.py +0 -0
  172. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/photometry/photutil.py +0 -0
  173. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/photometry/pysep.py +0 -0
  174. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/wcs/__init__.py +0 -0
  175. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/wcs/solarhelioprojective.py +0 -0
  176. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IAbortable.py +0 -0
  177. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IAcquisition.py +0 -0
  178. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IAutoFocus.py +0 -0
  179. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IAutoGuiding.py +0 -0
  180. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IAutonomous.py +0 -0
  181. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/ICalibrate.py +0 -0
  182. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/ICamera.py +0 -0
  183. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IData.py +0 -0
  184. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IDome.py +0 -0
  185. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IFitsHeaderAfter.py +0 -0
  186. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IFitsHeaderBefore.py +0 -0
  187. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IFlatField.py +0 -0
  188. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IFocusModel.py +0 -0
  189. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IPointingSeries.py +0 -0
  190. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IRoof.py +0 -0
  191. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IRunnable.py +0 -0
  192. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IScriptRunner.py +0 -0
  193. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/ISpectrograph.py +0 -0
  194. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IStartStop.py +0 -0
  195. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/ISyncTarget.py +0 -0
  196. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/ITelescope.py +0 -0
  197. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IWeather.py +0 -0
  198. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/mixins/__init__.py +0 -0
  199. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/mixins/camerasettings.py +0 -0
  200. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/mixins/fitsheader.py +0 -0
  201. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/mixins/fitsnamespace.py +0 -0
  202. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/mixins/follow.py +0 -0
  203. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/mixins/pipeline.py +0 -0
  204. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/mixins/waitformotion.py +0 -0
  205. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/mixins/weatheraware.py +0 -0
  206. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/__init__.py +0 -0
  207. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/camera/__init__.py +0 -0
  208. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/camera/adaptive.py +0 -0
  209. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/camera/basespectrograph.py +0 -0
  210. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/camera/dummyspectrograph.py +0 -0
  211. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/camera/pipelinecamera.py +0 -0
  212. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/flatfield/__init__.py +0 -0
  213. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/flatfield/pointing.py +0 -0
  214. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/flatfield/scheduler.py +0 -0
  215. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/focus/__init__.py +0 -0
  216. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/focus/focusmodel.py +0 -0
  217. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/focus/focusseries.py +0 -0
  218. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/image/__init__.py +0 -0
  219. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/image/imagewatcher.py +0 -0
  220. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/image/imagewriter.py +0 -0
  221. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/image/pipeline.py +0 -0
  222. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/image/seeing.py +0 -0
  223. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/pointing/__init__.py +0 -0
  224. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/pointing/_base.py +0 -0
  225. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/pointing/_baseguiding.py +0 -0
  226. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/pointing/acquisition.py +0 -0
  227. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/pointing/dummyacquisition.py +0 -0
  228. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/pointing/dummyguiding.py +0 -0
  229. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/pointing/guidingstatistics/__init__.py +0 -0
  230. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/pointing/guidingstatistics/guidingstatistics.py +0 -0
  231. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/pointing/guidingstatistics/pixeloffset.py +0 -0
  232. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/pointing/guidingstatistics/skyoffsets.py +0 -0
  233. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/pointing/guidingstatistics/uptime.py +0 -0
  234. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/pointing/scienceframeguiding.py +0 -0
  235. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/robotic/__init__.py +0 -0
  236. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/robotic/mastermind.py +0 -0
  237. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/robotic/pointing.py +0 -0
  238. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/robotic/scheduler.py +0 -0
  239. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/robotic/scriptrunner.py +0 -0
  240. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/roof/__init__.py +0 -0
  241. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/roof/basedome.py +0 -0
  242. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/roof/dummyroof.py +0 -0
  243. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/telescope/__init__.py +0 -0
  244. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/telescope/basetelescope.py +0 -0
  245. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/test/__init__.py +0 -0
  246. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/test/standalone.py +0 -0
  247. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/utils/__init__.py +0 -0
  248. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/utils/autonomouswarning.py +0 -0
  249. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/utils/fluentlogger.py +0 -0
  250. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/utils/httpfilecache.py +0 -0
  251. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/utils/kiosk.py +0 -0
  252. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/utils/matrix.py +0 -0
  253. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/utils/stellarium.py +0 -0
  254. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/utils/telegram.py +0 -0
  255. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/utils/trigger.py +0 -0
  256. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/weather/__init__.py +0 -0
  257. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/weather/weather.py +0 -0
  258. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/weather/weather_api.py +0 -0
  259. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/weather/weather_state.py +0 -0
  260. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/object.py +0 -0
  261. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/py.typed +0 -0
  262. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/__init__.py +0 -0
  263. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/observation.py +0 -0
  264. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/__init__.py +0 -0
  265. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/astroplanscheduler.py +0 -0
  266. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/constraints/__init__.py +0 -0
  267. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/constraints/airmassconstraint.py +0 -0
  268. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/constraints/constraint.py +0 -0
  269. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/constraints/moonilluminationconstraint.py +0 -0
  270. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/constraints/moonseparationconstraint.py +0 -0
  271. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/constraints/solarelevationconstraint.py +0 -0
  272. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/constraints/timeconstraint.py +0 -0
  273. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/dataprovider.py +0 -0
  274. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/merits/__init__.py +0 -0
  275. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/merits/aftertime.py +0 -0
  276. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/merits/beforetime.py +0 -0
  277. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/merits/constant.py +0 -0
  278. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/merits/follow.py +0 -0
  279. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/merits/interval.py +0 -0
  280. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/merits/merit.py +0 -0
  281. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/merits/pernight.py +0 -0
  282. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/merits/random.py +0 -0
  283. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/merits/timewindow.py +0 -0
  284. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/merits/transit.py +0 -0
  285. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/observationarchiveevolution.py +0 -0
  286. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/ondemandscheduler.py +0 -0
  287. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/targets/__init__.py +0 -0
  288. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/targets/dynamictarget.py +0 -0
  289. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/targets/helioprojectiveradialarget.py +0 -0
  290. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/targets/picker/__init__.py +0 -0
  291. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/targets/picker/csvpicker.py +0 -0
  292. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/targets/picker/picker.py +0 -0
  293. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/targets/siderealtarget.py +0 -0
  294. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/targets/target.py +0 -0
  295. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/taskscheduler.py +0 -0
  296. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/__init__.py +0 -0
  297. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/calibration/__init__.py +0 -0
  298. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/calibration/darkbias.py +0 -0
  299. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/calibration/pointing.py +0 -0
  300. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/calibration/skyflats.py +0 -0
  301. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/control/__init__.py +0 -0
  302. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/control/cases.py +0 -0
  303. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/control/conditional.py +0 -0
  304. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/control/parallel.py +0 -0
  305. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/control/selector.py +0 -0
  306. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/control/sequential.py +0 -0
  307. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/imaging/__init__.py +0 -0
  308. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/imaging/autofocus.py +0 -0
  309. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/imaging/imaging.py +0 -0
  310. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/imaging/transitimaging.py +0 -0
  311. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/script.py +0 -0
  312. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/utils/__init__.py +0 -0
  313. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/utils/callmodule.py +0 -0
  314. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/utils/debugtrigger.py +0 -0
  315. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/utils/log.py +0 -0
  316. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/__init__.py +0 -0
  317. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/backend/__init__.py +0 -0
  318. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/backend/observationarchive.py +0 -0
  319. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/backend/taskarchive.py +0 -0
  320. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/filesystem/__init__.py +0 -0
  321. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/filesystem/observationarchive.py +0 -0
  322. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/filesystem/taskarchive.py +0 -0
  323. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/lco/__init__.py +0 -0
  324. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/lco/_portal.py +0 -0
  325. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/lco/_schedulereader.py +0 -0
  326. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/lco/_schedulewriter.py +0 -0
  327. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/lco/configdb.py +0 -0
  328. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/lco/mockobservationarchive.py +0 -0
  329. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/lco/observationarchive.py +0 -0
  330. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/lco/scripts/__init__.py +0 -0
  331. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/lco/scripts/autofocus.py +0 -0
  332. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/lco/scripts/default.py +0 -0
  333. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/lco/scripts/script.py +0 -0
  334. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/lco/task.py +0 -0
  335. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/lco/taskarchive.py +0 -0
  336. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/lco/taskrunner.py +0 -0
  337. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/memory/__init__.py +0 -0
  338. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/memory/observationarchive.py +0 -0
  339. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/memory/taskarchive.py +0 -0
  340. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/observationarchive.py +0 -0
  341. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/taskarchive.py +0 -0
  342. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/task.py +0 -0
  343. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/taskrunner.py +0 -0
  344. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/__init__.py +0 -0
  345. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/archive/__init__.py +0 -0
  346. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/archive/archive.py +0 -0
  347. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/archive/local_archive.py +0 -0
  348. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/archive/pyobs_archive.py +0 -0
  349. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/exptime/__init__.py +0 -0
  350. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/exptime/exptime.py +0 -0
  351. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/exptime/stellarexptime.py +0 -0
  352. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/skyflats/__init__.py +0 -0
  353. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/skyflats/exptimeeval.py +0 -0
  354. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/skyflats/flatfielder.py +0 -0
  355. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/skyflats/pointing/__init__.py +0 -0
  356. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/skyflats/pointing/base.py +0 -0
  357. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/skyflats/pointing/static.py +0 -0
  358. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/skyflats/priorities/__init__.py +0 -0
  359. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/skyflats/priorities/archive.py +0 -0
  360. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/skyflats/priorities/base.py +0 -0
  361. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/skyflats/priorities/const.py +0 -0
  362. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/skyflats/scheduler.py +0 -0
  363. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/__init__.py +0 -0
  364. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/average.py +0 -0
  365. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/cache.py +0 -0
  366. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/config.py +0 -0
  367. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/coordinates.py +0 -0
  368. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/curvefit.py +0 -0
  369. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/enums.py +0 -0
  370. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/exceptions.py +0 -0
  371. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/fits.py +0 -0
  372. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/focusseries/__init__.py +0 -0
  373. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/focusseries/base.py +0 -0
  374. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/focusseries/photometry.py +0 -0
  375. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/focusseries/projection.py +0 -0
  376. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/grids/__init__.py +0 -0
  377. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/grids/filters.py +0 -0
  378. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/grids/grid.py +0 -0
  379. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/grids/gridnode.py +0 -0
  380. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/grids/pipeline.py +0 -0
  381. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/gui/__init__.py +0 -0
  382. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/gui/camera/__init__.py +0 -0
  383. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/gui/camera/binningwidget.py +0 -0
  384. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/gui/camera/datadisplaywidget.py +0 -0
  385. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/gui/camera/exposewidget.py +0 -0
  386. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/gui/camera/exposuretimewidget.py +0 -0
  387. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/gui/camera/imageformatwidget.py +0 -0
  388. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/gui/camera/listpickerdialog.py +0 -0
  389. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/gui/camera/windowingwidget.py +0 -0
  390. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/http.py +0 -0
  391. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/influxdb.py +0 -0
  392. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/logger.py +0 -0
  393. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/logging/__init__.py +0 -0
  394. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/logging/context.py +0 -0
  395. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/logging/resolvableerror.py +0 -0
  396. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/modulegui.py +0 -0
  397. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/offsets/__init__.py +0 -0
  398. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/offsets/applyaltazoffsets.py +0 -0
  399. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/offsets/applyoffsets.py +0 -0
  400. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/offsets/applyradecoffsets.py +0 -0
  401. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/parallel.py +0 -0
  402. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/pipeline/__init__.py +0 -0
  403. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/pipeline/night.py +0 -0
  404. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/pipeline/pipeline.py +0 -0
  405. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/publisher/__init__.py +0 -0
  406. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/publisher/csv.py +0 -0
  407. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/publisher/http.py +0 -0
  408. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/publisher/log.py +0 -0
  409. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/publisher/multi.py +0 -0
  410. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/publisher/publisher.py +0 -0
  411. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/serialization.py +0 -0
  412. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/shellcommand.py +0 -0
  413. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/threads/__init__.py +0 -0
  414. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/threads/lockwithabort.py +0 -0
  415. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/time.py +0 -0
  416. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/types.py +0 -0
  417. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/version.py +0 -0
  418. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/vfs/__init__.py +0 -0
  419. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/vfs/archivefile.py +0 -0
  420. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/vfs/bufferedfile.py +0 -0
  421. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/vfs/file.py +0 -0
  422. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/vfs/filelists/__init__.py +0 -0
  423. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/vfs/filelists/filelist.py +0 -0
  424. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/vfs/filelists/testing.py +0 -0
  425. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/vfs/httpfile.py +0 -0
  426. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/vfs/localfile.py +0 -0
  427. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/vfs/memfile.py +0 -0
  428. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/vfs/sftpfile.py +0 -0
  429. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/vfs/smbfile.py +0 -0
  430. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/vfs/sshfile.py +0 -0
  431. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/vfs/tempfile.py +0 -0
  432. {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/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.dev3
3
+ Version: 2.0.0.dev5
4
4
  Summary: robotic telescope software
5
5
  Author-email: Tim-Oliver Husser <thusser@uni-goettingen.de>
6
6
  License-Expression: MIT
@@ -4,7 +4,6 @@ import asyncio
4
4
  import functools
5
5
  import inspect
6
6
  import logging
7
- import sys
8
7
  from collections.abc import Callable, Coroutine
9
8
  from typing import TYPE_CHECKING, Any, overload
10
9
 
@@ -132,12 +131,20 @@ class Comm:
132
131
  except IndexError:
133
132
  return None
134
133
 
134
+ # collect capabilities (fixed at proxy construction time)
135
+ capabilities: dict[type[Interface], Any] = {}
136
+ for interface in interfaces:
137
+ if interface.capabilities is not None:
138
+ cap = await self._get_capabilities(client, interface)
139
+ if cap is not None:
140
+ capabilities[interface] = cap
141
+
135
142
  # create new proxy
136
- proxy = Proxy(self, client, interfaces)
143
+ proxy = Proxy(self, client, interfaces, capabilities)
137
144
 
138
145
  # subscribe to state
139
146
  for interface in interfaces:
140
- if getattr(interface, "State", None) is not None:
147
+ if interface.state is not None:
141
148
  await self.subscribe_state(client, interface, functools.partial(proxy.update_state, interface))
142
149
 
143
150
  self._proxies[client] = proxy
@@ -438,40 +445,29 @@ class Comm:
438
445
  ) -> None:
439
446
  pass
440
447
 
441
- @staticmethod
442
- def _interface_from_state(state_cls: type) -> type:
443
- outer_name = state_cls.__qualname__.rsplit(".", 1)[0]
444
- return getattr(sys.modules[state_cls.__module__], outer_name)
445
-
446
- async def set_state(self, state: Any) -> None:
448
+ async def set_state(self, interface: type[Interface], state: Any) -> None:
447
449
  """Publish state for this module.
448
450
 
449
451
  Args:
450
452
  interface: Interface type for the state.
451
453
  state: State object to publish.
452
454
  """
453
- interface = Comm._interface_from_state(type(state))
454
455
  await self._set_state(interface, state)
455
456
 
456
457
  async def _set_state(self, interface: type[Interface], state: Any) -> None:
457
458
  pass
458
459
 
459
- @staticmethod
460
- def _interface_from_capabilities(caps_cls: type) -> type:
461
- outer_name = caps_cls.__qualname__.rsplit(".", 1)[0]
462
- return getattr(sys.modules[caps_cls.__module__], outer_name)
463
-
464
- async def set_capabilities(self, capabilities: Any) -> None:
460
+ async def set_capabilities(self, interface: type[Interface], capabilities: Any) -> None:
465
461
  """Publish capabilities for this module.
466
462
 
467
- Called by Module.open() for each interface that defines a Capabilities
463
+ Called by Module.open() for each interface that defines a capabilities
468
464
  dataclass. Not intended to be called directly by module authors after
469
465
  that point — capabilities are fixed for the module lifetime.
470
466
 
471
467
  Args:
468
+ interface: Interface type the capabilities belong to.
472
469
  capabilities: Capabilities dataclass instance.
473
470
  """
474
- interface = Comm._interface_from_capabilities(type(capabilities))
475
471
  await self._set_capabilities(interface, capabilities)
476
472
 
477
473
  async def _set_capabilities(self, interface: type[Interface], capabilities: Any) -> None:
@@ -120,7 +120,7 @@ class LocalComm(Comm):
120
120
 
121
121
  async def _get_capabilities(self, module: str, interface: type[Interface]) -> Any | None:
122
122
  """Fetch capabilities from a remote module."""
123
- if not hasattr(interface, "Capabilities"):
123
+ if interface.capabilities is None:
124
124
  return None
125
125
  try:
126
126
  remote = self._network.get_client(module)
@@ -21,13 +21,20 @@ class Proxy:
21
21
 
22
22
  __module__ = "pyobs.comm"
23
23
 
24
- def __init__(self, comm: Comm, client: str, interfaces: list[type[Interface]]):
24
+ def __init__(
25
+ self,
26
+ comm: Comm,
27
+ client: str,
28
+ interfaces: list[type[Interface]],
29
+ capabilities: dict[type[Interface], Any] | None = None,
30
+ ):
25
31
  """Creates a new proxy.
26
32
 
27
33
  Args:
28
34
  comm: Comm object to use for connection.
29
35
  client: Name of client to connect to.
30
36
  interfaces: List of interfaces supported by client.
37
+ capabilities: Pre-populated capabilities dict, keyed by interface type.
31
38
  """
32
39
 
33
40
  # set client and interfaces
@@ -53,8 +60,9 @@ class Proxy:
53
60
  # create methods
54
61
  self._methods = self._create_methods()
55
62
 
56
- # store state
63
+ # store state and capabilities
57
64
  self._state: dict[type[Interface], Any] = {}
65
+ self._capabilities: dict[type[Interface], Any] = capabilities if capabilities is not None else {}
58
66
 
59
67
  @property
60
68
  def name(self) -> str:
@@ -170,6 +178,10 @@ class Proxy:
170
178
  """Latest known state for the given interface, or None if nothing has arrived yet."""
171
179
  return self._state.get(interface)
172
180
 
181
+ def capabilities(self, interface: type[Interface]) -> Any | None:
182
+ """Capabilities for the given interface, populated once at Proxy construction."""
183
+ return self._capabilities.get(interface)
184
+
173
185
  async def wait_for_state(
174
186
  self,
175
187
  interface: type[Interface],
@@ -658,7 +658,7 @@ class XmppComm(Comm):
658
658
  item_xml = items_xml.find(f"{{{pubsub_ns}}}item")
659
659
  payload = list(item_xml)[0] if item_xml is not None and len(item_xml) > 0 else None
660
660
  if payload is not None:
661
- state_obj = _xml_to_dataclass(payload, interface.State)
661
+ state_obj = _xml_to_dataclass(payload, interface.state)
662
662
  for callback in callbacks:
663
663
  callback(state_obj)
664
664
  else:
@@ -786,7 +786,7 @@ class XmppComm(Comm):
786
786
  item_xml = items_xml.find(f"{{{pubsub_ns}}}item") if items_xml is not None else None
787
787
  payload = list(item_xml)[0] if item_xml is not None and len(item_xml) > 0 else None
788
788
  if payload is not None:
789
- callback(_xml_to_dataclass(payload, interface.State))
789
+ callback(_xml_to_dataclass(payload, interface.state))
790
790
  except (slixmpp.exceptions.IqError, slixmpp.exceptions.IqTimeout):
791
791
  pass
792
792
 
@@ -828,7 +828,7 @@ class XmppComm(Comm):
828
828
 
829
829
  async def _get_capabilities(self, module: str, interface: type[Interface]) -> Any | None:
830
830
  """Fetch and deserialize capabilities for a remote module's interface."""
831
- if not hasattr(interface, "Capabilities"):
831
+ if interface.capabilities is None:
832
832
  return None
833
833
  # Use full JID (with resource) if we know it — bare JID may not route correctly
834
834
  full_jid = next(
@@ -848,7 +848,7 @@ class XmppComm(Comm):
848
848
  for elem in child:
849
849
  tag = elem.tag.split("}")[-1]
850
850
  if tag == "capabilities" and f"{{{ns}}}" in elem.tag:
851
- return _xml_to_dataclass(elem, interface.Capabilities)
851
+ return _xml_to_dataclass(elem, interface.capabilities)
852
852
  return None
853
853
 
854
854
  async def _set_presence(self, state: ModuleState, error_string: str = "") -> None:
@@ -902,7 +902,7 @@ class XmppComm(Comm):
902
902
  payload = list(item_xml)[0] if item_xml is not None and len(item_xml) > 0 else None
903
903
  if payload is not None and node in self._state_node_handlers:
904
904
  _, callbacks = self._state_node_handlers[node]
905
- state_obj = _xml_to_dataclass(payload, interface.State)
905
+ state_obj = _xml_to_dataclass(payload, interface.state)
906
906
  for cb in callbacks:
907
907
  cb(state_obj)
908
908
  except (slixmpp.exceptions.IqError, slixmpp.exceptions.IqTimeout):
@@ -8,20 +8,25 @@ from ..utils.time import Time
8
8
  from .interface import Interface
9
9
 
10
10
 
11
+ @dataclass
12
+ class BinningState:
13
+ x: int
14
+ y: int
15
+ time: Time = field(default_factory=Time.now)
16
+
17
+
18
+ @dataclass
19
+ class BinningCapabilities:
20
+ binnings: list[BinningState] = field(default_factory=list)
21
+
22
+
11
23
  class IBinning(Interface, metaclass=ABCMeta):
12
24
  """The camera supports binning, to be used together with :class:`~pyobs.interfaces.ICamera`."""
13
25
 
14
26
  __module__ = "pyobs.interfaces"
15
27
 
16
- @dataclass
17
- class State:
18
- x: int
19
- y: int
20
- time: Time = field(default_factory=Time.now)
21
-
22
- @dataclass
23
- class Capabilities:
24
- binnings: list[IBinning.State] = field(default_factory=list)
28
+ state = BinningState
29
+ capabilities = BinningCapabilities
25
30
 
26
31
  @abstractmethod
27
32
  async def set_binning(self, x: int, y: int, **kwargs: Any) -> None:
@@ -37,4 +42,4 @@ class IBinning(Interface, metaclass=ABCMeta):
37
42
  ...
38
43
 
39
44
 
40
- __all__ = ["IBinning"]
45
+ __all__ = ["IBinning", "BinningState", "BinningCapabilities"]
@@ -7,16 +7,17 @@ from typing import Any
7
7
  from .interface import Interface
8
8
 
9
9
 
10
+ @dataclass
11
+ class ConfigCapabilities:
12
+ caps: dict[str, tuple[bool, bool, bool]] = field(default_factory=dict)
13
+
14
+
10
15
  class IConfig(Interface, metaclass=ABCMeta):
11
16
  """The module allows access to some of its configuration options."""
12
17
 
13
18
  __module__ = "pyobs.interfaces"
14
19
 
15
- @dataclass
16
- class Capabilities:
17
- readable: list[str] = field(default_factory=list)
18
- writable: list[str] = field(default_factory=list)
19
- options: dict[str, list[str]] = field(default_factory=dict)
20
+ capabilities = ConfigCapabilities
20
21
 
21
22
  @abstractmethod
22
23
  async def get_config_value(self, name: str, **kwargs: Any) -> Any:
@@ -47,4 +48,4 @@ class IConfig(Interface, metaclass=ABCMeta):
47
48
  ...
48
49
 
49
50
 
50
- __all__ = ["IConfig"]
51
+ __all__ = ["IConfig", "ConfigCapabilities"]
@@ -9,17 +9,20 @@ from ..utils.time import Time
9
9
  from .ITemperatures import ITemperatures
10
10
 
11
11
 
12
+ @dataclass
13
+ class CoolingState:
14
+ setpoint: Annotated[float, Unit.CELSIUS] | None
15
+ power: Annotated[int, Unit.PERCENT] | None
16
+ enabled: bool
17
+ time: Time = field(default_factory=Time.now)
18
+
19
+
12
20
  class ICooling(ITemperatures, metaclass=ABCMeta):
13
21
  """The module can control the cooling of a device."""
14
22
 
15
23
  __module__ = "pyobs.interfaces"
16
24
 
17
- @dataclass
18
- class State:
19
- setpoint: Annotated[float, Unit.CELSIUS] | None
20
- power: Annotated[int, Unit.PERCENT] | None
21
- enabled: bool
22
- time: Time = field(default_factory=Time.now)
25
+ state = CoolingState
23
26
 
24
27
  @abstractmethod
25
28
  async def set_cooling(self, enabled: bool, setpoint: Annotated[float, Unit.CELSIUS], **kwargs: Any) -> None:
@@ -35,4 +38,4 @@ class ICooling(ITemperatures, metaclass=ABCMeta):
35
38
  ...
36
39
 
37
40
 
38
- __all__ = ["ICooling"]
41
+ __all__ = ["ICooling", "CoolingState"]
@@ -10,17 +10,20 @@ from ..utils.time import Time
10
10
  from .interface import Interface
11
11
 
12
12
 
13
+ @dataclass
14
+ class ExposureState:
15
+ status: ExposureStatus
16
+ progress: Annotated[float, Unit.PERCENT]
17
+ exposure_time_left: Annotated[float, Unit.SECONDS] = 0.0
18
+ time: Time = field(default_factory=Time.now)
19
+
20
+
13
21
  class IExposure(Interface, metaclass=ABCMeta):
14
22
  """The module controls a camera."""
15
23
 
16
24
  __module__ = "pyobs.interfaces"
17
25
 
18
- @dataclass
19
- class State:
20
- status: ExposureStatus
21
- progress: Annotated[float, Unit.PERCENT]
22
- exposure_time_left: Annotated[float, Unit.SECONDS] = 0.0
23
- time: Time = field(default_factory=Time.now)
26
+ state = ExposureState
24
27
 
25
28
 
26
- __all__ = ["IExposure"]
29
+ __all__ = ["IExposure", "ExposureState"]
@@ -9,15 +9,18 @@ from ..utils.time import Time
9
9
  from .interface import Interface
10
10
 
11
11
 
12
+ @dataclass
13
+ class ExposureTimeState:
14
+ exposure_time: Annotated[float, Unit.SECONDS]
15
+ time: Time = field(default_factory=Time.now)
16
+
17
+
12
18
  class IExposureTime(Interface, metaclass=ABCMeta):
13
19
  """The camera supports exposure times, to be used together with :class:`~pyobs.interfaces.ICamera`."""
14
20
 
15
21
  __module__ = "pyobs.interfaces"
16
22
 
17
- @dataclass
18
- class State:
19
- exposure_time: Annotated[float, Unit.SECONDS]
20
- time: Time = field(default_factory=Time.now)
23
+ state = ExposureTimeState
21
24
 
22
25
  @abstractmethod
23
26
  async def set_exposure_time(self, exposure_time: Annotated[float, Unit.SECONDS], **kwargs: Any) -> None:
@@ -32,4 +35,4 @@ class IExposureTime(Interface, metaclass=ABCMeta):
32
35
  ...
33
36
 
34
37
 
35
- __all__ = ["IExposureTime"]
38
+ __all__ = ["IExposureTime", "ExposureTimeState"]
@@ -8,19 +8,24 @@ from ..utils.time import Time
8
8
  from .IMotion import IMotion
9
9
 
10
10
 
11
+ @dataclass
12
+ class FilterState:
13
+ filter: str
14
+ time: Time = field(default_factory=Time.now)
15
+
16
+
17
+ @dataclass
18
+ class FiltersCapabilities:
19
+ filters: list[str] = field(default_factory=list)
20
+
21
+
11
22
  class IFilters(IMotion, metaclass=ABCMeta):
12
23
  """The module can change filters in a device."""
13
24
 
14
25
  __module__ = "pyobs.interfaces"
15
26
 
16
- @dataclass
17
- class State:
18
- filter: str
19
- time: Time = field(default_factory=Time.now)
20
-
21
- @dataclass
22
- class Capabilities:
23
- filters: list[str] = field(default_factory=list)
27
+ state = FilterState
28
+ capabilities = FiltersCapabilities
24
29
 
25
30
  @abstractmethod
26
31
  async def set_filter(self, filter_name: str, **kwargs: Any) -> None:
@@ -36,4 +41,4 @@ class IFilters(IMotion, metaclass=ABCMeta):
36
41
  ...
37
42
 
38
43
 
39
- __all__ = ["IFilters"]
44
+ __all__ = ["IFilters", "FilterState", "FiltersCapabilities"]
@@ -8,16 +8,19 @@ from ..utils.time import Time
8
8
  from .IMotion import IMotion
9
9
 
10
10
 
11
+ @dataclass
12
+ class FocuserState:
13
+ focus: float
14
+ focus_offset: float
15
+ time: Time = field(default_factory=Time.now)
16
+
17
+
11
18
  class IFocuser(IMotion, metaclass=ABCMeta):
12
19
  """The module is a focusing device."""
13
20
 
14
21
  __module__ = "pyobs.interfaces"
15
22
 
16
- @dataclass
17
- class State:
18
- focus: float
19
- focus_offset: float
20
- time: Time = field(default_factory=Time.now)
23
+ state = FocuserState
21
24
 
22
25
  @abstractmethod
23
26
  async def set_focus(self, focus: float, **kwargs: Any) -> None:
@@ -46,4 +49,4 @@ class IFocuser(IMotion, metaclass=ABCMeta):
46
49
  ...
47
50
 
48
51
 
49
- __all__ = ["IFocuser"]
52
+ __all__ = ["IFocuser", "FocuserState"]
@@ -8,16 +8,19 @@ from ..utils.time import Time
8
8
  from .interface import Interface
9
9
 
10
10
 
11
+ @dataclass
12
+ class GainState:
13
+ gain: float
14
+ offset: float
15
+ time: Time = field(default_factory=Time.now)
16
+
17
+
11
18
  class IGain(Interface, metaclass=ABCMeta):
12
19
  """The camera supports setting of gain, to be used together with :class:`~pyobs.interfaces.ICamera`."""
13
20
 
14
21
  __module__ = "pyobs.interfaces"
15
22
 
16
- @dataclass
17
- class State:
18
- gain: float
19
- offset: float
20
- time: Time = field(default_factory=Time.now)
23
+ state = GainState
21
24
 
22
25
  @abstractmethod
23
26
  async def set_gain(self, gain: float, **kwargs: Any) -> None:
@@ -44,4 +47,4 @@ class IGain(Interface, metaclass=ABCMeta):
44
47
  ...
45
48
 
46
49
 
47
- __all__ = ["IGain"]
50
+ __all__ = ["IGain", "GainState"]
@@ -10,19 +10,24 @@ from ..utils.time import Time
10
10
  from .interface import Interface
11
11
 
12
12
 
13
+ @dataclass
14
+ class ImageFormatState:
15
+ image_format: ImageFormat
16
+ time: Time = field(default_factory=Time.now)
17
+
18
+
19
+ @dataclass
20
+ class ImageFormatCapabilities:
21
+ image_formats: list[str] = field(default_factory=list)
22
+
23
+
13
24
  class IImageFormat(Interface, metaclass=ABCMeta):
14
25
  """The module supports different image formats (e.g. INT16, FLOAT32), mainly used by cameras."""
15
26
 
16
27
  __module__ = "pyobs.interfaces"
17
28
 
18
- @dataclass
19
- class State:
20
- image_format: ImageFormat
21
- time: Time = field(default_factory=Time.now)
22
-
23
- @dataclass
24
- class Capabilities:
25
- image_formats: list[str] = field(default_factory=list)
29
+ state = ImageFormatState
30
+ capabilities = ImageFormatCapabilities
26
31
 
27
32
  @abstractmethod
28
33
  async def set_image_format(self, fmt: ImageFormat, **kwargs: Any) -> None:
@@ -37,4 +42,4 @@ class IImageFormat(Interface, metaclass=ABCMeta):
37
42
  ...
38
43
 
39
44
 
40
- __all__ = ["IImageFormat"]
45
+ __all__ = ["IImageFormat", "ImageFormatState", "ImageFormatCapabilities"]
@@ -10,15 +10,18 @@ from ..utils.time import Time
10
10
  from .interface import Interface
11
11
 
12
12
 
13
+ @dataclass
14
+ class ImageTypeState:
15
+ image_type: ImageType
16
+ time: Time = field(default_factory=Time.now)
17
+
18
+
13
19
  class IImageType(Interface, metaclass=ABCMeta):
14
20
  """The module supports different image types (e.g. object, bias, dark, etc), mainly used by cameras."""
15
21
 
16
22
  __module__ = "pyobs.interfaces"
17
23
 
18
- @dataclass
19
- class State:
20
- image_type: ImageType
21
- time: Time = field(default_factory=Time.now)
24
+ state = ImageTypeState
22
25
 
23
26
  @abstractmethod
24
27
  async def set_image_type(self, image_type: ImageType, **kwargs: Any) -> None:
@@ -30,4 +33,4 @@ class IImageType(Interface, metaclass=ABCMeta):
30
33
  ...
31
34
 
32
35
 
33
- __all__ = ["IImageType"]
36
+ __all__ = ["IImageType", "ImageTypeState"]
@@ -8,19 +8,24 @@ from ..utils.time import Time
8
8
  from .interface import Interface
9
9
 
10
10
 
11
+ @dataclass
12
+ class ModeState:
13
+ modes: dict[str, str] = field(default_factory=dict) # group -> current mode
14
+ time: Time = field(default_factory=Time.now)
15
+
16
+
17
+ @dataclass
18
+ class ModeCapabilities:
19
+ modes: dict[str, list[str]] = field(default_factory=dict) # group -> list of modes
20
+
21
+
11
22
  class IMode(Interface, metaclass=ABCMeta):
12
23
  """The module can change modes in a device."""
13
24
 
14
25
  __module__ = "pyobs.interfaces"
15
26
 
16
- @dataclass
17
- class Capabilities:
18
- modes: dict[str, list[str]] = field(default_factory=dict) # group -> list of modes
19
-
20
- @dataclass
21
- class State:
22
- modes: dict[str, str] = field(default_factory=dict) # group -> current mode
23
- time: Time = field(default_factory=Time.now)
27
+ state = ModeState
28
+ capabilities = ModeCapabilities
24
29
 
25
30
  @abstractmethod
26
31
  async def set_mode(self, mode: str, group: int = 0, **kwargs: Any) -> None:
@@ -37,4 +42,4 @@ class IMode(Interface, metaclass=ABCMeta):
37
42
  ...
38
43
 
39
44
 
40
- __all__ = ["IMode"]
45
+ __all__ = ["IMode", "ModeState", "ModeCapabilities"]
@@ -7,15 +7,18 @@ from typing import Any
7
7
  from .interface import Interface
8
8
 
9
9
 
10
+ @dataclass
11
+ class ModuleCapabilities:
12
+ label: str = ""
13
+ version: str = ""
14
+
15
+
10
16
  class IModule(Interface, metaclass=ABCMeta):
11
17
  """The module is actually a module. Implemented by all modules."""
12
18
 
13
19
  __module__ = "pyobs.interfaces"
14
20
 
15
- @dataclass
16
- class Capabilities:
17
- version: str = ""
18
- label: str = ""
21
+ capabilities = ModuleCapabilities
19
22
 
20
23
  @abstractmethod
21
24
  async def reset_error(self, **kwargs: Any) -> bool:
@@ -23,4 +26,4 @@ class IModule(Interface, metaclass=ABCMeta):
23
26
  ...
24
27
 
25
28
 
26
- __all__ = ["IModule"]
29
+ __all__ = ["IModule", "ModuleCapabilities"]
@@ -10,21 +10,25 @@ from ..utils.time import Time
10
10
  from .IReady import IReady
11
11
 
12
12
 
13
+ @dataclass
14
+ class DeviceMotionStatus:
15
+ name: str
16
+ status: MotionStatus
17
+
18
+
19
+ @dataclass
20
+ class MotionState:
21
+ status: MotionStatus
22
+ devices: list[DeviceMotionStatus] = field(default_factory=list)
23
+ time: Time = field(default_factory=Time.now)
24
+
25
+
13
26
  class IMotion(IReady, metaclass=ABCMeta):
14
27
  """The module controls a device that can move."""
15
28
 
16
29
  __module__ = "pyobs.interfaces"
17
30
 
18
- @dataclass
19
- class DeviceMotionStatus:
20
- name: str
21
- status: MotionStatus
22
-
23
- @dataclass
24
- class State:
25
- status: MotionStatus
26
- devices: list[IMotion.DeviceMotionStatus] = field(default_factory=list)
27
- time: Time = field(default_factory=Time.now)
31
+ state = MotionState
28
32
 
29
33
  @abstractmethod
30
34
  async def init(self, **kwargs: Any) -> None:
@@ -54,4 +58,4 @@ class IMotion(IReady, metaclass=ABCMeta):
54
58
  ...
55
59
 
56
60
 
57
- __all__ = ["IMotion"]
61
+ __all__ = ["IMotion", "DeviceMotionStatus", "MotionState"]
@@ -8,24 +8,28 @@ from ..utils.time import Time
8
8
  from .interface import Interface
9
9
 
10
10
 
11
+ @dataclass
12
+ class MultiFiberState:
13
+ fiber: str = ""
14
+ pixel_x: float = 0.0
15
+ pixel_y: float = 0.0
16
+ radius: float = 0.0
17
+ time: Time = field(default_factory=Time.now)
18
+
19
+
20
+ @dataclass
21
+ class MultiFiberCapabilities:
22
+ fiber_count: int = 0
23
+
24
+
11
25
  class IMultiFiber(Interface, metaclass=ABCMeta):
12
26
  """An interface for multi-fiber setups that helps to set/get a fiber and retrieve position and size of the
13
27
  current fiber on the acquisition/guiding image."""
14
28
 
15
29
  __module__ = "pyobs.interfaces"
16
30
 
17
- @dataclass
18
- class Capabilities:
19
- fiber_count: int = 0
20
- fiber_names: list[str] = field(default_factory=list)
21
-
22
- @dataclass
23
- class State:
24
- fiber: str = ""
25
- pixel_x: float = 0.0
26
- pixel_y: float = 0.0
27
- radius: float = 0.0
28
- time: Time = field(default_factory=Time.now)
31
+ state = MultiFiberState
32
+ capabilities = MultiFiberCapabilities
29
33
 
30
34
  @abstractmethod
31
35
  async def abort(self, **kwargs: Any) -> None:
@@ -42,4 +46,4 @@ class IMultiFiber(Interface, metaclass=ABCMeta):
42
46
  ...
43
47
 
44
48
 
45
- __all__ = ["IMultiFiber"]
49
+ __all__ = ["IMultiFiber", "MultiFiberState", "MultiFiberCapabilities"]