pyobs-core 2.0.0.dev84__tar.gz → 2.0.0.dev86__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.dev84 → pyobs_core-2.0.0.dev86}/PKG-INFO +1 -1
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/comm/xmpp/xmppcomm.py +31 -2
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/mixins/fitsheader.py +9 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/task.py +1 -0
- pyobs_core-2.0.0.dev86/pyobs/utils/http.py +79 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyproject.toml +1 -1
- pyobs_core-2.0.0.dev84/pyobs/utils/http.py +0 -46
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/.gitignore +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/LICENSE +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/application.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/background_task.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/cli/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/cli/_cli.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/cli/pyobs.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/cli/pyobsd.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/cli/pyobsw.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/comm/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/comm/comm.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/comm/commlogging.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/comm/dummy/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/comm/dummy/dummycomm.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/comm/local/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/comm/local/localcomm.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/comm/local/localnetwork.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/comm/proxy.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/comm/xmpp/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/comm/xmpp/rpc.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/comm/xmpp/serializer.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/comm/xmpp/xep_0009/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/comm/xmpp/xep_0009/binding.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/comm/xmpp/xep_0009/rpc.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/comm/xmpp/xep_0009_timeout/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/comm/xmpp/xep_0009_timeout/rpc.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/comm/xmpp/xep_0009_timeout/stanza/RPC.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/comm/xmpp/xep_0009_timeout/stanza/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/comm/xmpp/xmppclient.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/events/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/events/badweather.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/events/event.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/events/exposurestatuschanged.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/events/filterchanged.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/events/focusfound.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/events/goodweather.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/events/log.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/events/modechanged.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/events/moduleclosed.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/events/moduleopened.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/events/motionstatuschanged.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/events/move.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/events/newimage.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/events/newspectrum.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/events/offsets.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/events/roofclosing.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/events/roofopened.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/events/taskfailed.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/events/taskfinished.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/events/taskstarted.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/events/testevent.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/image.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/meta/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/meta/altazoffsets.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/meta/exptime.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/meta/genericoffset.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/meta/onskydistance.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/meta/pixeloffsets.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/meta/radecoffsets.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/meta/skyoffsets.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processor.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/_daobackgroundremover.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/annotation/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/annotation/_pillow.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/annotation/circle.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/annotation/crosshair.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/annotation/text.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/astrometry/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/astrometry/_dotnet_request.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/astrometry/_dotnet_request_builder.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/astrometry/_dotnet_request_logger.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/astrometry/_dotnet_response_saver.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/astrometry/astrometry.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/astrometry/dotnet.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/calibration/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/calibration/_calibration_cache.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/calibration/_ccddata_calibrator.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/calibration/calibration.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/detection/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/detection/_pysep_stats_calculator.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/detection/_source_catalog.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/detection/daophot.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/detection/pysep.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/detection/simpledisk.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/detection/sourcedetection.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/exptime/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/exptime/exptime.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/exptime/star.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/image/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/image/addfitsheaders.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/image/download.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/image/flip.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/image/grayscale.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/image/httpserver.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/image/normalize.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/image/save.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/image/saveimage.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/image/smooth.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/image/softbin.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/misc/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/misc/addmask.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/misc/catalogcircularmask.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/misc/circularmask.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/misc/createfilename.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/misc/imagesourcefilter.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/misc/removebackground.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/modules/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/modules/getfitsheaders.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/offsets/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/offsets/astrometry.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/offsets/brighteststar.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/offsets/brighteststar_guiding.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/offsets/dummyoffsets.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/offsets/dummyskyoffsets.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/offsets/fitsheader.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/offsets/offsets.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/offsets/pixeloffsets.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/offsets/projected.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/offsets/spilled_light.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/photometry/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/photometry/_photometry_calculator.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/photometry/_photutil_aperture_photometry.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/photometry/_sep_aperture_photometry.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/photometry/aperture_photometry.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/photometry/photometry.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/photometry/photutil.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/photometry/pysep.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/wcs/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/wcs/solarhelioprojective.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IAbortable.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IAcquisition.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IAutoFocus.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IAutoGuiding.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IAutonomous.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IBinning.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/ICalibrate.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/ICamera.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IConfig.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/ICooling.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IData.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IDataSequence.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IDome.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IExposure.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IExposureTime.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IFilters.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IFitsHeaderAfter.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IFitsHeaderBefore.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IFlatField.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IFocusModel.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IFocuser.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IGain.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IImageFormat.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IImageType.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IMode.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IModule.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IMotion.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IMultiFiber.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IOffsetsAltAz.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IOffsetsRaDec.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IPointingAltAz.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IPointingBody.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IPointingHeliocentricPolar.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IPointingHeliographicStonyhurst.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IPointingHelioprojective.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IPointingOrbitalElements.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IPointingRaDec.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IPointingSeries.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IReady.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IRoof.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IRotation.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IRunnable.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IRunning.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IScriptRunner.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/ISpectrograph.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IStartStop.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IStructuredConfig.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/ISyncTarget.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/ITelescope.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/ITemperatures.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/ITrackingMode.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/ITrackingRate.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IVideo.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IWeather.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/IWindow.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/interfaces/interface.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/mixins/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/mixins/camerasettings.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/mixins/fitsnamespace.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/mixins/follow.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/mixins/motionstatus.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/mixins/pipeline.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/mixins/waitformotion.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/mixins/weatheraware.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/camera/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/camera/adaptive.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/camera/basecamera.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/camera/basespectrograph.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/camera/basevideo.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/camera/dummycamera.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/camera/dummyspectrograph.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/camera/dummyvideo.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/camera/pipelinecamera.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/flatfield/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/flatfield/flatfield.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/flatfield/pointing.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/flatfield/scheduler.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/focus/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/focus/dummyautofocus.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/focus/focusmodel.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/focus/focusseries.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/image/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/image/imagewatcher.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/image/imagewriter.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/image/pipeline.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/image/seeing.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/module.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/pointing/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/pointing/_base.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/pointing/_baseguiding.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/pointing/acquisition.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/pointing/autoguiding.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/pointing/dummyacquisition.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/pointing/dummyguiding.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/pointing/guidingstatistics/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/pointing/guidingstatistics/guidingstatistics.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/pointing/guidingstatistics/pixeloffset.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/pointing/guidingstatistics/skyoffsets.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/pointing/guidingstatistics/uptime.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/pointing/scienceframeguiding.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/robotic/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/robotic/mastermind.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/robotic/pointing.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/robotic/scheduler.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/robotic/scriptrunner.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/roof/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/roof/basedome.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/roof/baseroof.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/roof/dummyroof.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/telescope/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/telescope/_dummytelescopebase.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/telescope/basetelescope.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/telescope/dummyaltaztelescope.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/telescope/dummyradectelescope.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/telescope/dummysolartelescope.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/test/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/test/standalone.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/utils/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/utils/dummymode.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/utils/fluentlogger.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/utils/httpfilecache.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/utils/kiosk.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/utils/matrix.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/utils/stellarium.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/utils/telegram.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/utils/trigger.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/weather/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/weather/mockweather.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/weather/weather.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/weather/weather_api.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/modules/weather/weather_state.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/object.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/py.typed +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/observation.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/_executor.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/astroplanscheduler.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/constraints/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/constraints/airmassconstraint.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/constraints/constraint.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/constraints/moonilluminationconstraint.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/constraints/moonseparationconstraint.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/constraints/solarelevationconstraint.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/constraints/timeconstraint.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/dataprovider.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/merits/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/merits/aftertime.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/merits/beforetime.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/merits/constant.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/merits/follow.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/merits/interval.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/merits/merit.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/merits/pernight.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/merits/random.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/merits/timewindow.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/merits/transit.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/observationarchiveevolution.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/ondemandscheduler.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/targets/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/targets/dynamictarget.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/targets/heliocentricpolartarget.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/targets/helioprojectivetarget.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/targets/picker/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/targets/picker/csvpicker.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/targets/picker/picker.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/targets/siderealtarget.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/targets/target.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scheduler/taskscheduler.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scripts/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scripts/calibration/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scripts/calibration/darkbias.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scripts/calibration/pointing.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scripts/calibration/skyflats.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scripts/control/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scripts/control/cases.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scripts/control/conditional.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scripts/control/parallel.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scripts/control/selector.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scripts/control/sequential.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scripts/exceptions.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scripts/imaging/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scripts/imaging/autofocus.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scripts/imaging/imaging.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scripts/imaging/transitimaging.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scripts/script.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scripts/utils/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scripts/utils/callmodule.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scripts/utils/debugtrigger.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/scripts/utils/log.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/storage/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/storage/backend/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/storage/backend/observationarchive.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/storage/backend/taskarchive.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/storage/filesystem/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/storage/filesystem/observationarchive.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/storage/filesystem/taskarchive.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/storage/lco/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/storage/lco/_portal.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/storage/lco/_schedulereader.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/storage/lco/_schedulewriter.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/storage/lco/configdb.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/storage/lco/mockobservationarchive.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/storage/lco/observationarchive.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/storage/lco/scripts/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/storage/lco/scripts/autofocus.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/storage/lco/scripts/default.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/storage/lco/scripts/script.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/storage/lco/task.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/storage/lco/taskarchive.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/storage/lco/taskrunner.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/storage/memory/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/storage/memory/observationarchive.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/storage/memory/taskarchive.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/storage/observationarchive.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/storage/taskarchive.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/taskrunner.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/utils/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/utils/archive/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/utils/archive/archive.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/utils/archive/local_archive.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/utils/archive/pyobs_archive.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/utils/exptime/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/utils/exptime/exptime.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/utils/exptime/stellarexptime.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/utils/skyflats/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/utils/skyflats/exptimeeval.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/utils/skyflats/flatfielder.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/utils/skyflats/pointing/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/utils/skyflats/pointing/base.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/utils/skyflats/pointing/static.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/utils/skyflats/priorities/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/utils/skyflats/priorities/archive.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/utils/skyflats/priorities/base.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/utils/skyflats/priorities/const.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/robotic/utils/skyflats/scheduler.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/average.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/cache.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/config.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/config_schema.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/coordinates.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/curvefit.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/enums.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/exceptions.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/fits.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/focusseries/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/focusseries/base.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/focusseries/photometry.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/focusseries/projection.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/grids/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/grids/filters.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/grids/grid.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/grids/gridnode.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/grids/pipeline.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/gui/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/gui/camera/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/gui/camera/binningwidget.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/gui/camera/datadisplaywidget.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/gui/camera/exposewidget.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/gui/camera/exposuretimewidget.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/gui/camera/imageformatwidget.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/gui/camera/listpickerdialog.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/gui/camera/windowingwidget.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/influxdb.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/logger.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/logging/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/logging/context.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/logging/resolvableerror.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/modulegui.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/offsets/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/offsets/applyaltazoffsets.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/offsets/applyoffsets.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/offsets/applyradecoffsets.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/parallel.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/pipeline/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/pipeline/pipeline.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/pipeline/progress.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/pipeline/reduction.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/pipeline/reduction_base.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/publisher/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/publisher/csv.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/publisher/http.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/publisher/log.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/publisher/multi.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/publisher/publisher.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/serialization.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/shellcommand.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/threads/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/threads/lockwithabort.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/time.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/units.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/utils/versions.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/version.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/vfs/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/vfs/archivefile.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/vfs/bufferedfile.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/vfs/file.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/vfs/filelists/__init__.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/vfs/filelists/filelist.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/vfs/filelists/testing.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/vfs/httpfile.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/vfs/localfile.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/vfs/memfile.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/vfs/sftpfile.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/vfs/smbfile.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/vfs/sshfile.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/vfs/tempfile.py +0 -0
- {pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/vfs/vfs.py +0 -0
|
@@ -60,6 +60,21 @@ def _retry_delay(attempt: int, cap: float = 30.0, base: float = 1.0) -> float:
|
|
|
60
60
|
return random.uniform(0, min(cap, base * (2**attempt)))
|
|
61
61
|
|
|
62
62
|
|
|
63
|
+
def _log_task_exception(task: asyncio.Task[Any]) -> None:
|
|
64
|
+
"""Retrieve and log a background task's exception, if it failed.
|
|
65
|
+
|
|
66
|
+
Results of asyncio.create_task() that are never awaited or callback-ed have their
|
|
67
|
+
exceptions reported by the event loop's default handler as "Task exception was never
|
|
68
|
+
retrieved" -- a noisy ERROR traceback that carries no context. Retrieving the exception
|
|
69
|
+
here turns that into a normal log line with the task's failure attached.
|
|
70
|
+
"""
|
|
71
|
+
if task.cancelled():
|
|
72
|
+
return
|
|
73
|
+
exc = task.exception()
|
|
74
|
+
if exc is not None:
|
|
75
|
+
log.error("Unhandled exception in XMPP event handler task", exc_info=exc)
|
|
76
|
+
|
|
77
|
+
|
|
63
78
|
# anchored at both ends -- re.match alone doesn't anchor the end, so e.g. "user@domain/res/extra"
|
|
64
79
|
# would otherwise still "match" as a valid prefix
|
|
65
80
|
_JID_RE = re.compile(r"([\w_\-\.]+)@([\w_\-\.]+)/([\w_\-\.]+)$")
|
|
@@ -979,7 +994,12 @@ class XmppComm(Comm):
|
|
|
979
994
|
for callback in callbacks:
|
|
980
995
|
callback(state_obj)
|
|
981
996
|
else:
|
|
982
|
-
|
|
997
|
+
# Non-state notifications are handled asynchronously. Attach a done-callback so the
|
|
998
|
+
# task's exception is retrieved: without it, a failure inside _handle_event is never
|
|
999
|
+
# retrieved and asyncio reports it as "Task exception was never retrieved" (see
|
|
1000
|
+
# _handle_event for the payload-less notification case that used to trigger this).
|
|
1001
|
+
task = asyncio.create_task(self._handle_event(msg, node))
|
|
1002
|
+
task.add_done_callback(_log_task_exception)
|
|
983
1003
|
|
|
984
1004
|
async def _handle_event(self, msg: Any, node: str) -> None:
|
|
985
1005
|
"""Handles an event.
|
|
@@ -994,7 +1014,16 @@ class XmppComm(Comm):
|
|
|
994
1014
|
# get body, unescape it, parse it
|
|
995
1015
|
# State-node messages are handled synchronously in _handle_event_sync
|
|
996
1016
|
# before this async task runs. By the time we get here it's a pyobs event.
|
|
997
|
-
|
|
1017
|
+
# Not every notification carries an item with a payload: retract stanzas,
|
|
1018
|
+
# node purges, and nodes with deliver_payloads off all arrive payload-less.
|
|
1019
|
+
# The state-node path copes via _fetch_and_dispatch_state; for events there is
|
|
1020
|
+
# nothing to refetch, so just drop the notification.
|
|
1021
|
+
items = msg["pubsub_event"]["items"]
|
|
1022
|
+
item = items["item"] if items is not None else None
|
|
1023
|
+
payload = item["payload"] if item is not None else None
|
|
1024
|
+
if payload is None or payload.text is None:
|
|
1025
|
+
return
|
|
1026
|
+
body = json.loads(xml.sax.saxutils.unescape(payload.text))
|
|
998
1027
|
|
|
999
1028
|
# do we have a <delay> element?
|
|
1000
1029
|
delay = msg.xml.findall("{urn:sleekxmpp:delay}delay")
|
|
@@ -135,6 +135,15 @@ class FitsHeaderMixin:
|
|
|
135
135
|
except exc.RemoteError as e:
|
|
136
136
|
log.warning("Could not fetch FITS headers from %s: %s.", client, str(e))
|
|
137
137
|
continue
|
|
138
|
+
except Exception as e:
|
|
139
|
+
# XmppComm.execute() only converts IqError/IqTimeout into RemoteError; anything
|
|
140
|
+
# else raised while making or deserializing the RPC call (e.g. a peer returning a
|
|
141
|
+
# malformed IFitsHeaderBefore/After response) escapes as a raw exception. That must
|
|
142
|
+
# not take down the whole exposure -- log and skip this peer's headers (#767).
|
|
143
|
+
log.warning(
|
|
144
|
+
"Could not fetch FITS headers from %s: unexpected %s: %s.", client, type(e).__name__, str(e)
|
|
145
|
+
)
|
|
146
|
+
continue
|
|
138
147
|
|
|
139
148
|
# add them to fits file
|
|
140
149
|
if headers:
|
|
@@ -150,6 +150,7 @@ class Project(BaseModel):
|
|
|
150
150
|
name: str = ""
|
|
151
151
|
priority: float | None = Field(ge=0.0, le=9999.0, default=1.0)
|
|
152
152
|
users: list[str] = Field(default_factory=list)
|
|
153
|
+
public: bool = False # ingest backend `public` flag; default keeps old backends valid
|
|
153
154
|
|
|
154
155
|
|
|
155
156
|
__all__ = ["Task", "TaskData", "Project"]
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import logging
|
|
3
|
+
from typing import Any, cast
|
|
4
|
+
|
|
5
|
+
import aiohttp
|
|
6
|
+
from tenacity import (
|
|
7
|
+
before_sleep_log,
|
|
8
|
+
retry,
|
|
9
|
+
retry_if_exception_type,
|
|
10
|
+
stop_after_attempt,
|
|
11
|
+
wait_exponential,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
log = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class InvalidResponseError(RuntimeError):
|
|
18
|
+
"""Raised when the server returns an unexpected HTTP status. Carries the status and, if
|
|
19
|
+
available, the parsed JSON body, so callers can distinguish specific failure modes."""
|
|
20
|
+
|
|
21
|
+
def __init__(self, status: int, body: Any = None):
|
|
22
|
+
self.status = status
|
|
23
|
+
self.body = body
|
|
24
|
+
super().__init__(f"Invalid response from server: HTTP {status}")
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@retry(
|
|
28
|
+
retry=retry_if_exception_type((aiohttp.ClientError, asyncio.TimeoutError, RuntimeError)),
|
|
29
|
+
wait=wait_exponential(multiplier=1, min=1, max=30),
|
|
30
|
+
stop=stop_after_attempt(5),
|
|
31
|
+
before_sleep=before_sleep_log(log, logging.WARNING),
|
|
32
|
+
reraise=True,
|
|
33
|
+
)
|
|
34
|
+
async def http_request_with_retries(
|
|
35
|
+
session: aiohttp.ClientSession, url: str, method: str = "get", expected_status: int = 200, **kwargs: Any
|
|
36
|
+
) -> dict[str, Any]:
|
|
37
|
+
async with session.request(method, url, **kwargs) as response:
|
|
38
|
+
if response.status != expected_status:
|
|
39
|
+
body = None
|
|
40
|
+
try:
|
|
41
|
+
body = await response.json()
|
|
42
|
+
except (aiohttp.ContentTypeError, ValueError):
|
|
43
|
+
pass
|
|
44
|
+
raise InvalidResponseError(response.status, body)
|
|
45
|
+
return cast(dict[str, Any], await response.json())
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
async def http_request_paginated(
|
|
49
|
+
session: aiohttp.ClientSession, url: str, method: str = "get", expected_status: int = 200, **kwargs: Any
|
|
50
|
+
) -> list[dict[str, Any]]:
|
|
51
|
+
"""Fetches all pages of a DRF-style paginated list endpoint and returns the combined results.
|
|
52
|
+
|
|
53
|
+
If a page beyond the first becomes invalid mid-fetch (DRF's "Invalid page." 404, which can
|
|
54
|
+
happen when concurrent writes shift page boundaries on a live-growing dataset), pagination
|
|
55
|
+
stops early with whatever was already fetched instead of failing the whole request.
|
|
56
|
+
"""
|
|
57
|
+
results: list[dict[str, Any]] = []
|
|
58
|
+
next_url: str | None = url
|
|
59
|
+
is_first_page = True
|
|
60
|
+
while next_url is not None:
|
|
61
|
+
try:
|
|
62
|
+
data = await http_request_with_retries(
|
|
63
|
+
session, next_url, method=method, expected_status=expected_status, **kwargs
|
|
64
|
+
)
|
|
65
|
+
except InvalidResponseError as e:
|
|
66
|
+
if (
|
|
67
|
+
not is_first_page
|
|
68
|
+
and e.status == 404
|
|
69
|
+
and isinstance(e.body, dict)
|
|
70
|
+
and e.body.get("detail") == "Invalid page."
|
|
71
|
+
):
|
|
72
|
+
log.warning("Pagination page became invalid mid-fetch, stopping early with %d result(s).", len(results))
|
|
73
|
+
break
|
|
74
|
+
raise
|
|
75
|
+
results.extend(data["results"])
|
|
76
|
+
next_url = data.get("next")
|
|
77
|
+
kwargs = {}
|
|
78
|
+
is_first_page = False
|
|
79
|
+
return results
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import asyncio
|
|
2
|
-
import logging
|
|
3
|
-
from typing import Any, cast
|
|
4
|
-
|
|
5
|
-
import aiohttp
|
|
6
|
-
from tenacity import (
|
|
7
|
-
before_sleep_log,
|
|
8
|
-
retry,
|
|
9
|
-
retry_if_exception_type,
|
|
10
|
-
stop_after_attempt,
|
|
11
|
-
wait_exponential,
|
|
12
|
-
)
|
|
13
|
-
|
|
14
|
-
log = logging.getLogger(__name__)
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
@retry(
|
|
18
|
-
retry=retry_if_exception_type((aiohttp.ClientError, asyncio.TimeoutError, RuntimeError)),
|
|
19
|
-
wait=wait_exponential(multiplier=1, min=1, max=30),
|
|
20
|
-
stop=stop_after_attempt(5),
|
|
21
|
-
before_sleep=before_sleep_log(log, logging.WARNING),
|
|
22
|
-
reraise=True,
|
|
23
|
-
)
|
|
24
|
-
async def http_request_with_retries(
|
|
25
|
-
session: aiohttp.ClientSession, url: str, method: str = "get", expected_status: int = 200, **kwargs: Any
|
|
26
|
-
) -> dict[str, Any]:
|
|
27
|
-
async with session.request(method, url, **kwargs) as response:
|
|
28
|
-
if response.status != expected_status:
|
|
29
|
-
raise RuntimeError(f"Invalid response from server: HTTP {response.status}")
|
|
30
|
-
return cast(dict[str, Any], await response.json())
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
async def http_request_paginated(
|
|
34
|
-
session: aiohttp.ClientSession, url: str, method: str = "get", expected_status: int = 200, **kwargs: Any
|
|
35
|
-
) -> list[dict[str, Any]]:
|
|
36
|
-
"""Fetches all pages of a DRF-style paginated list endpoint and returns the combined results."""
|
|
37
|
-
results: list[dict[str, Any]] = []
|
|
38
|
-
next_url: str | None = url
|
|
39
|
-
while next_url is not None:
|
|
40
|
-
data = await http_request_with_retries(
|
|
41
|
-
session, next_url, method=method, expected_status=expected_status, **kwargs
|
|
42
|
-
)
|
|
43
|
-
results.extend(data["results"])
|
|
44
|
-
next_url = data.get("next")
|
|
45
|
-
kwargs = {}
|
|
46
|
-
return results
|
|
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.dev84 → pyobs_core-2.0.0.dev86}/pyobs/comm/xmpp/xep_0009_timeout/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/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
|
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/_daobackgroundremover.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/annotation/__init__.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/annotation/_pillow.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/annotation/circle.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/annotation/crosshair.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/annotation/text.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/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.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/astrometry/astrometry.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/astrometry/dotnet.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/calibration/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/calibration/calibration.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/detection/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/detection/daophot.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/detection/pysep.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/detection/simpledisk.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/exptime/__init__.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/exptime/exptime.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/image/addfitsheaders.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/image/grayscale.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/image/httpserver.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/image/normalize.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/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.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/misc/circularmask.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/misc/createfilename.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/misc/imagesourcefilter.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/misc/removebackground.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/modules/__init__.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/modules/getfitsheaders.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/offsets/__init__.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/offsets/astrometry.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/offsets/brighteststar.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/offsets/dummyoffsets.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/offsets/dummyskyoffsets.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/offsets/fitsheader.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/offsets/offsets.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/offsets/pixeloffsets.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/offsets/projected.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/offsets/spilled_light.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/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.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/photometry/photometry.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/pyobs/images/processors/photometry/photutil.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev84 → pyobs_core-2.0.0.dev86}/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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|