pyobs-core 2.0.0.dev31__tar.gz → 2.0.0.dev33__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.
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/PKG-INFO +1 -1
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/xmpp/xmppclient.py +15 -2
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/xmpp/xmppcomm.py +78 -19
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyproject.toml +1 -1
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/.gitignore +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/LICENSE +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/application.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/background_task.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/cli/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/cli/_cli.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/cli/pyobs.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/cli/pyobsd.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/cli/pyobsw.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/comm.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/commlogging.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/dummy/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/dummy/dummycomm.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/local/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/local/localcomm.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/local/localnetwork.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/proxy.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/xmpp/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/xmpp/rpc.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/xmpp/serializer.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/xmpp/xep_0009/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/xmpp/xep_0009/binding.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/xmpp/xep_0009/rpc.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/xmpp/xep_0009_timeout/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/xmpp/xep_0009_timeout/rpc.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/xmpp/xep_0009_timeout/stanza/RPC.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/xmpp/xep_0009_timeout/stanza/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/badweather.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/event.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/exposurestatuschanged.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/filterchanged.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/focusfound.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/goodweather.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/log.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/modechanged.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/moduleclosed.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/moduleopened.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/motionstatuschanged.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/move.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/newimage.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/newspectrum.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/offsets.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/roofclosing.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/roofopened.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/taskfailed.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/taskfinished.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/taskstarted.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/events/testevent.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/image.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/meta/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/meta/altazoffsets.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/meta/exptime.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/meta/genericoffset.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/meta/onskydistance.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/meta/pixeloffsets.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/meta/radecoffsets.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/meta/skyoffsets.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processor.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/_daobackgroundremover.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/annotation/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/annotation/_pillow.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/annotation/circle.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/annotation/crosshair.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/annotation/text.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/astrometry/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/astrometry/_dotnet_request.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/astrometry/_dotnet_request_builder.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/astrometry/_dotnet_request_logger.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/astrometry/_dotnet_response_saver.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/astrometry/astrometry.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/astrometry/dotnet.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/calibration/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/calibration/_calibration_cache.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/calibration/_ccddata_calibrator.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/calibration/calibration.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/detection/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/detection/_pysep_stats_calculator.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/detection/_source_catalog.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/detection/daophot.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/detection/pysep.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/detection/simpledisk.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/detection/sourcedetection.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/exptime/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/exptime/exptime.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/exptime/star.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/image/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/image/addfitsheaders.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/image/download.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/image/flip.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/image/grayscale.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/image/httpserver.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/image/normalize.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/image/save.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/image/saveimage.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/image/smooth.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/image/softbin.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/misc/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/misc/addmask.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/misc/catalogcircularmask.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/misc/circularmask.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/misc/createfilename.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/misc/imagesourcefilter.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/misc/removebackground.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/modules/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/modules/getfitsheaders.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/astrometry.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/brighteststar.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/brighteststar_guiding.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/dummyoffsets.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/dummyskyoffsets.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/fitsheader.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/offsets.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/pixeloffsets.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/projected.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/spilled_light.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/photometry/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/photometry/_photometry_calculator.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/photometry/_photutil_aperture_photometry.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/photometry/_sep_aperture_photometry.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/photometry/aperture_photometry.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/photometry/photometry.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/photometry/photutil.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/photometry/pysep.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/wcs/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/wcs/solarhelioprojective.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IAbortable.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IAcquisition.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IAutoFocus.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IAutoGuiding.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IAutonomous.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IBinning.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/ICalibrate.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/ICamera.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IConfig.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/ICooling.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IData.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IDataSequence.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IDome.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IExposure.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IExposureTime.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IFilters.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IFitsHeaderAfter.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IFitsHeaderBefore.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IFlatField.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IFocusModel.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IFocuser.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IGain.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IImageFormat.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IImageType.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IMode.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IModule.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IMotion.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IMultiFiber.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IOffsetsAltAz.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IOffsetsRaDec.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IPointingAltAz.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IPointingBody.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IPointingHeliocentricPolar.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IPointingHeliographicStonyhurst.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IPointingHelioprojective.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IPointingOrbitalElements.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IPointingRaDec.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IPointingSeries.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IReady.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IRoof.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IRotation.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IRunnable.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IRunning.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IScriptRunner.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/ISpectrograph.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IStartStop.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IStructuredConfig.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/ISyncTarget.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/ITelescope.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/ITemperatures.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/ITrackingMode.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/ITrackingRate.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IVideo.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IWeather.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/IWindow.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/interfaces/interface.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/mixins/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/mixins/camerasettings.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/mixins/fitsheader.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/mixins/fitsnamespace.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/mixins/follow.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/mixins/motionstatus.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/mixins/pipeline.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/mixins/waitformotion.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/mixins/weatheraware.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/camera/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/camera/adaptive.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/camera/basecamera.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/camera/basespectrograph.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/camera/basevideo.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/camera/dummycamera.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/camera/dummyspectrograph.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/camera/dummyvideo.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/camera/pipelinecamera.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/flatfield/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/flatfield/flatfield.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/flatfield/pointing.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/flatfield/scheduler.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/focus/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/focus/dummyautofocus.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/focus/focusmodel.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/focus/focusseries.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/image/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/image/imagewatcher.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/image/imagewriter.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/image/pipeline.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/image/seeing.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/module.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/pointing/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/pointing/_base.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/pointing/_baseguiding.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/pointing/acquisition.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/pointing/autoguiding.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/pointing/dummyacquisition.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/pointing/dummyguiding.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/pointing/guidingstatistics/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/pointing/guidingstatistics/guidingstatistics.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/pointing/guidingstatistics/pixeloffset.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/pointing/guidingstatistics/skyoffsets.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/pointing/guidingstatistics/uptime.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/pointing/scienceframeguiding.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/robotic/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/robotic/mastermind.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/robotic/pointing.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/robotic/scheduler.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/robotic/scriptrunner.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/roof/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/roof/basedome.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/roof/baseroof.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/roof/dummyroof.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/telescope/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/telescope/_dummytelescopebase.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/telescope/basetelescope.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/telescope/dummyaltaztelescope.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/telescope/dummyradectelescope.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/telescope/dummysolartelescope.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/test/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/test/standalone.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/utils/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/utils/dummymode.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/utils/fluentlogger.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/utils/httpfilecache.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/utils/kiosk.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/utils/matrix.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/utils/stellarium.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/utils/telegram.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/utils/trigger.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/weather/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/weather/mockweather.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/weather/weather.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/weather/weather_api.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/modules/weather/weather_state.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/object.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/py.typed +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/observation.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/astroplanscheduler.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/constraints/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/constraints/airmassconstraint.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/constraints/constraint.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/constraints/moonilluminationconstraint.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/constraints/moonseparationconstraint.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/constraints/solarelevationconstraint.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/constraints/timeconstraint.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/dataprovider.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/merits/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/merits/aftertime.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/merits/beforetime.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/merits/constant.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/merits/follow.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/merits/interval.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/merits/merit.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/merits/pernight.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/merits/random.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/merits/timewindow.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/merits/transit.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/observationarchiveevolution.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/ondemandscheduler.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/targets/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/targets/dynamictarget.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/targets/heliocentricpolartarget.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/targets/helioprojectivetarget.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/targets/picker/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/targets/picker/csvpicker.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/targets/picker/picker.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/targets/siderealtarget.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/targets/target.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scheduler/taskscheduler.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/calibration/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/calibration/darkbias.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/calibration/pointing.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/calibration/skyflats.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/control/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/control/cases.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/control/conditional.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/control/parallel.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/control/selector.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/control/sequential.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/exceptions.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/imaging/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/imaging/autofocus.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/imaging/imaging.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/imaging/transitimaging.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/script.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/utils/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/utils/callmodule.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/utils/debugtrigger.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/scripts/utils/log.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/backend/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/backend/observationarchive.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/backend/taskarchive.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/filesystem/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/filesystem/observationarchive.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/filesystem/taskarchive.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/lco/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/lco/_portal.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/lco/_schedulereader.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/lco/_schedulewriter.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/lco/configdb.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/lco/mockobservationarchive.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/lco/observationarchive.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/lco/scripts/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/lco/scripts/autofocus.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/lco/scripts/default.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/lco/scripts/script.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/lco/task.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/lco/taskarchive.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/lco/taskrunner.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/memory/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/memory/observationarchive.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/memory/taskarchive.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/observationarchive.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/storage/taskarchive.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/task.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/taskrunner.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/archive/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/archive/archive.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/archive/local_archive.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/archive/pyobs_archive.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/exptime/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/exptime/exptime.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/exptime/stellarexptime.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/skyflats/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/skyflats/exptimeeval.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/skyflats/flatfielder.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/skyflats/pointing/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/skyflats/pointing/base.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/skyflats/pointing/static.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/skyflats/priorities/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/skyflats/priorities/archive.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/skyflats/priorities/base.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/skyflats/priorities/const.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/robotic/utils/skyflats/scheduler.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/average.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/cache.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/config.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/config_schema.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/coordinates.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/curvefit.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/enums.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/exceptions.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/fits.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/focusseries/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/focusseries/base.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/focusseries/photometry.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/focusseries/projection.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/grids/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/grids/filters.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/grids/grid.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/grids/gridnode.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/grids/pipeline.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/gui/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/gui/camera/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/gui/camera/binningwidget.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/gui/camera/datadisplaywidget.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/gui/camera/exposewidget.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/gui/camera/exposuretimewidget.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/gui/camera/imageformatwidget.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/gui/camera/listpickerdialog.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/gui/camera/windowingwidget.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/http.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/influxdb.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/logger.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/logging/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/logging/context.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/logging/resolvableerror.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/modulegui.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/offsets/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/offsets/applyaltazoffsets.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/offsets/applyoffsets.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/offsets/applyradecoffsets.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/parallel.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/pipeline/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/pipeline/night.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/pipeline/pipeline.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/publisher/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/publisher/csv.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/publisher/http.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/publisher/log.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/publisher/multi.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/publisher/publisher.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/serialization.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/shellcommand.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/threads/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/threads/lockwithabort.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/time.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/utils/units.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/version.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/vfs/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/vfs/archivefile.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/vfs/bufferedfile.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/vfs/file.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/vfs/filelists/__init__.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/vfs/filelists/filelist.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/vfs/filelists/testing.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/vfs/httpfile.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/vfs/localfile.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/vfs/memfile.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/vfs/sftpfile.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/vfs/smbfile.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/vfs/sshfile.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/vfs/tempfile.py +0 -0
- {pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/vfs/vfs.py +0 -0
|
@@ -15,7 +15,14 @@ log = logging.getLogger(__name__)
|
|
|
15
15
|
class XmppClient(slixmpp.ClientXMPP):
|
|
16
16
|
"""XMPP client for pyobs."""
|
|
17
17
|
|
|
18
|
-
def __init__(
|
|
18
|
+
def __init__(
|
|
19
|
+
self,
|
|
20
|
+
jid: str,
|
|
21
|
+
password: str,
|
|
22
|
+
ping_interval: float = 300.0,
|
|
23
|
+
ping_timeout: float = 30.0,
|
|
24
|
+
**kwargs: Any,
|
|
25
|
+
):
|
|
19
26
|
"""Create a new XMPP client.
|
|
20
27
|
|
|
21
28
|
An XmppClient handles the actual XMPP communication for the XmppComm module.
|
|
@@ -23,6 +30,12 @@ class XmppClient(slixmpp.ClientXMPP):
|
|
|
23
30
|
Args:
|
|
24
31
|
jid: Connect to the XMPP server with the given JID.
|
|
25
32
|
password: Password to use for connection.
|
|
33
|
+
ping_interval: Seconds between XEP-0199 keepalive pings.
|
|
34
|
+
ping_timeout: Seconds to wait for a ping reply before treating the connection as
|
|
35
|
+
dead and reconnecting. If the server-side shaper can delay an IQ reply by more
|
|
36
|
+
than this, keepalive pings misfire as false disconnects -- raise this to be more
|
|
37
|
+
tolerant of a throttled/slow server instead of only tolerating a genuinely dead
|
|
38
|
+
connection.
|
|
26
39
|
"""
|
|
27
40
|
|
|
28
41
|
slixmpp.ClientXMPP.__init__(self, jid, password, **kwargs)
|
|
@@ -51,7 +64,7 @@ class XmppClient(slixmpp.ClientXMPP):
|
|
|
51
64
|
self.register_plugin("xep_0199") # XMPP Ping
|
|
52
65
|
|
|
53
66
|
# enable keep alive pings
|
|
54
|
-
self.plugin["xep_0199"].enable_keepalive()
|
|
67
|
+
self.plugin["xep_0199"].enable_keepalive(interval=ping_interval, timeout=ping_timeout)
|
|
55
68
|
|
|
56
69
|
# handle session_start and message events
|
|
57
70
|
self.add_event_handler("session_start", self.session_start)
|
|
@@ -4,6 +4,7 @@ import asyncio
|
|
|
4
4
|
import functools
|
|
5
5
|
import json
|
|
6
6
|
import logging
|
|
7
|
+
import random
|
|
7
8
|
import re
|
|
8
9
|
import ssl
|
|
9
10
|
import time
|
|
@@ -36,6 +37,17 @@ if TYPE_CHECKING:
|
|
|
36
37
|
log = logging.getLogger(__name__)
|
|
37
38
|
|
|
38
39
|
|
|
40
|
+
def _retry_delay(attempt: int, cap: float = 30.0, base: float = 1.0) -> float:
|
|
41
|
+
"""Capped exponential backoff with full jitter.
|
|
42
|
+
|
|
43
|
+
Used for retry loops that can end up running on every module in the fleet at once (e.g.
|
|
44
|
+
every module reconnecting to ejabberd simultaneously after a mass restart). Fixed-interval
|
|
45
|
+
retries stay in lockstep across all of them, repeatedly hammering the server at the same
|
|
46
|
+
instants; jitter decorrelates that so retries spread out over time instead.
|
|
47
|
+
"""
|
|
48
|
+
return random.uniform(0, min(cap, base * (2**attempt)))
|
|
49
|
+
|
|
50
|
+
|
|
39
51
|
class EventStanza(ElementBase):
|
|
40
52
|
name = "event"
|
|
41
53
|
namespace = "pyobs:event"
|
|
@@ -95,6 +107,16 @@ class XmppComm(Comm):
|
|
|
95
107
|
Finally, always make sure that ``use_tls`` is set according to the server's settings, i.e. if it uses TLS, this
|
|
96
108
|
parameter must be True, and False otherwise. Cryptic error messages will follow, if one does not set this properly.
|
|
97
109
|
|
|
110
|
+
``ping_interval``/``ping_timeout`` control the XEP-0199 keepalive ping that detects a dead connection.
|
|
111
|
+
``ping_timeout`` in particular may need raising above its 30s default on a server whose shaper can delay an IQ
|
|
112
|
+
reply that long under load -- otherwise a merely-slow reply is indistinguishable from a dead connection and
|
|
113
|
+
triggers a reconnect that didn't need to happen::
|
|
114
|
+
|
|
115
|
+
comm:
|
|
116
|
+
class: pyobs.comm.xmpp.XmppComm
|
|
117
|
+
jid: someuser@example.com/pyobs
|
|
118
|
+
ping_timeout: 60
|
|
119
|
+
|
|
98
120
|
"""
|
|
99
121
|
|
|
100
122
|
__module__ = "pyobs.comm.xmpp"
|
|
@@ -109,6 +131,8 @@ class XmppComm(Comm):
|
|
|
109
131
|
server: str | None = None,
|
|
110
132
|
use_tls: bool = False,
|
|
111
133
|
ignore_cert_errors: bool = False,
|
|
134
|
+
ping_interval: float = 300.0,
|
|
135
|
+
ping_timeout: float = 30.0,
|
|
112
136
|
*args: Any,
|
|
113
137
|
**kwargs: Any,
|
|
114
138
|
):
|
|
@@ -124,6 +148,8 @@ class XmppComm(Comm):
|
|
|
124
148
|
password: Password for given JID.
|
|
125
149
|
server: Server to connect to. If not given, domain from JID is used.
|
|
126
150
|
use_tls: Whether to use TLS.
|
|
151
|
+
ping_interval: Seconds between XEP-0199 keepalive pings.
|
|
152
|
+
ping_timeout: Seconds to wait for a ping reply before reconnecting.
|
|
127
153
|
"""
|
|
128
154
|
Comm.__init__(self, *args, **kwargs)
|
|
129
155
|
|
|
@@ -140,6 +166,8 @@ class XmppComm(Comm):
|
|
|
140
166
|
self._server = server
|
|
141
167
|
self._use_tls = use_tls
|
|
142
168
|
self._ignore_cert_errors = ignore_cert_errors
|
|
169
|
+
self._ping_interval = ping_interval
|
|
170
|
+
self._ping_timeout = ping_timeout
|
|
143
171
|
self._loop = asyncio.get_event_loop()
|
|
144
172
|
self._safe_send_attempts = 5
|
|
145
173
|
self._safe_send_wait = 1
|
|
@@ -217,7 +245,9 @@ class XmppComm(Comm):
|
|
|
217
245
|
self._xmpp.abort()
|
|
218
246
|
|
|
219
247
|
# create client
|
|
220
|
-
self._xmpp = XmppClient(
|
|
248
|
+
self._xmpp = XmppClient(
|
|
249
|
+
self._jid, self._password, ping_interval=self._ping_interval, ping_timeout=self._ping_timeout
|
|
250
|
+
)
|
|
221
251
|
|
|
222
252
|
# presence gating (see mark_ready()) only applies to a comm with an actual Module
|
|
223
253
|
# attached that hasn't finished starting yet -- a module-less XmppComm (a GUI, an
|
|
@@ -929,8 +959,12 @@ class XmppComm(Comm):
|
|
|
929
959
|
async def _get_capabilities(self, module: str, interface: type[Interface]) -> Any | None:
|
|
930
960
|
"""Fetch and deserialize capabilities for a remote module's interface.
|
|
931
961
|
|
|
932
|
-
Retries
|
|
933
|
-
|
|
962
|
+
Retries indefinitely (capped exponential backoff with jitter) instead of giving up after
|
|
963
|
+
a fixed budget -- a peer that's merely slow to respond (e.g. every module in the fleet
|
|
964
|
+
reconnecting to ejabberd at once) must still eventually get its capabilities fetched
|
|
965
|
+
without requiring a full disconnect/reconnect of that peer to retrigger discovery. Only
|
|
966
|
+
stops if the peer itself goes offline in the meantime, since a fresh fetch is triggered
|
|
967
|
+
from scratch the next time it comes back online (see _got_online).
|
|
934
968
|
"""
|
|
935
969
|
if interface.capabilities is None:
|
|
936
970
|
return None
|
|
@@ -938,24 +972,36 @@ class XmppComm(Comm):
|
|
|
938
972
|
|
|
939
973
|
result = None
|
|
940
974
|
last_error: BaseException | None = None
|
|
941
|
-
|
|
975
|
+
attempt = 0
|
|
976
|
+
while True:
|
|
942
977
|
# Use full JID (with resource) if we know it — bare JID may not route correctly
|
|
943
|
-
full_jid = next(
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
978
|
+
full_jid = next((jid for jid in self._online_clients if jid.startswith(f"{module}@")), None)
|
|
979
|
+
if full_jid is None and attempt > 0:
|
|
980
|
+
log.debug(
|
|
981
|
+
"Giving up fetching capabilities for %s from %s: peer went offline",
|
|
982
|
+
interface.__name__,
|
|
983
|
+
module,
|
|
984
|
+
)
|
|
985
|
+
return None
|
|
947
986
|
try:
|
|
948
987
|
result = await asyncio.wait_for(
|
|
949
|
-
self.client.plugin["xep_0030"].get_info(jid=JID(full_jid)),
|
|
988
|
+
self.client.plugin["xep_0030"].get_info(jid=JID(full_jid or f"{module}@{self._domain}")),
|
|
989
|
+
timeout=10.0,
|
|
950
990
|
)
|
|
951
991
|
break
|
|
952
|
-
except
|
|
992
|
+
except Exception as e:
|
|
953
993
|
last_error = e
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
994
|
+
attempt += 1
|
|
995
|
+
if attempt == 3:
|
|
996
|
+
log.warning(
|
|
997
|
+
"Still failing to get capabilities for %s from %s after %d attempts (%s), "
|
|
998
|
+
"will keep retrying",
|
|
999
|
+
interface.__name__,
|
|
1000
|
+
module,
|
|
1001
|
+
attempt,
|
|
1002
|
+
last_error,
|
|
1003
|
+
)
|
|
1004
|
+
await asyncio.sleep(_retry_delay(attempt))
|
|
959
1005
|
log.debug("get_capabilities disco result XML: %s", ET.tostring(result.xml).decode()[:500])
|
|
960
1006
|
# result.xml is the <iq> — the <query> is its child, capabilities are grandchildren
|
|
961
1007
|
for child in result.xml:
|
|
@@ -1012,17 +1058,30 @@ class XmppComm(Comm):
|
|
|
1012
1058
|
async def _subscribe_with_retry(self, node: str, interface: type[Interface]) -> None:
|
|
1013
1059
|
"""Subscribe to a pubsub node, retrying until the node exists.
|
|
1014
1060
|
|
|
1015
|
-
Runs as a background task so _subscribe_state returns immediately.
|
|
1061
|
+
Runs as a background task so _subscribe_state returns immediately. Retries indefinitely
|
|
1062
|
+
(capped exponential backoff with jitter) instead of giving up after a fixed budget -- a
|
|
1063
|
+
node that's merely slow to appear (e.g. every module in the fleet reconnecting to
|
|
1064
|
+
ejabberd at once, or the publisher hasn't started up yet) must still eventually get
|
|
1065
|
+
subscribed without manual intervention. Stops only if _unsubscribe_state removes the
|
|
1066
|
+
last callback for this node in the meantime -- the while condition then goes False,
|
|
1067
|
+
which exits the loop into the else clause (not the break path) and returns.
|
|
1016
1068
|
Once subscribed, fetches the current value and dispatches it.
|
|
1017
1069
|
"""
|
|
1018
|
-
|
|
1070
|
+
attempt = 0
|
|
1071
|
+
while node in self._state_node_handlers:
|
|
1019
1072
|
try:
|
|
1020
1073
|
await self._safe_send(self.client.plugin["xep_0060"].subscribe, self._pubsub_service, node)
|
|
1021
1074
|
break
|
|
1022
1075
|
except (slixmpp.exceptions.IqError, slixmpp.exceptions.IqTimeout):
|
|
1023
|
-
|
|
1076
|
+
attempt += 1
|
|
1077
|
+
if attempt == 30:
|
|
1078
|
+
log.warning(
|
|
1079
|
+
"Still failing to subscribe to state node %s after %d attempts, will keep retrying",
|
|
1080
|
+
node,
|
|
1081
|
+
attempt,
|
|
1082
|
+
)
|
|
1083
|
+
await asyncio.sleep(_retry_delay(attempt))
|
|
1024
1084
|
else:
|
|
1025
|
-
log.warning("Could not subscribe to state node %s after 30 attempts", node)
|
|
1026
1085
|
return
|
|
1027
1086
|
|
|
1028
1087
|
# Fetch current value immediately after subscribing
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/xmpp/xep_0009_timeout/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/comm/xmpp/xep_0009_timeout/stanza/RPC.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/_daobackgroundremover.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/annotation/__init__.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/annotation/_pillow.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/annotation/circle.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/annotation/crosshair.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/annotation/text.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/astrometry/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/astrometry/astrometry.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/astrometry/dotnet.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/calibration/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/calibration/calibration.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/detection/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/detection/daophot.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/detection/pysep.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/detection/simpledisk.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/exptime/__init__.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/exptime/exptime.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/image/addfitsheaders.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/image/grayscale.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/image/httpserver.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/image/normalize.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/image/saveimage.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/misc/circularmask.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/misc/createfilename.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/misc/imagesourcefilter.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/misc/removebackground.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/modules/__init__.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/modules/getfitsheaders.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/__init__.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/astrometry.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/brighteststar.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/dummyoffsets.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/dummyskyoffsets.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/fitsheader.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/offsets.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/pixeloffsets.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/projected.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/offsets/spilled_light.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/photometry/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/photometry/photometry.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/photometry/photutil.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev31 → pyobs_core-2.0.0.dev33}/pyobs/images/processors/photometry/pysep.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|