pyobs-core 2.0.0.dev95__tar.gz → 2.0.0.dev98__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.dev95 → pyobs_core-2.0.0.dev98}/PKG-INFO +1 -1
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/robotic/scheduler.py +1 -1
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/observation.py +6 -0
- pyobs_core-2.0.0.dev98/pyobs/robotic/storage/portal/__init__.py +4 -0
- {pyobs_core-2.0.0.dev95/pyobs/robotic/storage/backend → pyobs_core-2.0.0.dev98/pyobs/robotic/storage/portal}/observationarchive.py +13 -13
- {pyobs_core-2.0.0.dev95/pyobs/robotic/storage/backend → pyobs_core-2.0.0.dev98/pyobs/robotic/storage/portal}/taskarchive.py +16 -16
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/task.py +3 -3
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyproject.toml +1 -1
- pyobs_core-2.0.0.dev95/pyobs/robotic/storage/backend/__init__.py +0 -4
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/.gitignore +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/LICENSE +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/application.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/background_task.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/cli/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/cli/_cli.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/cli/pyobs.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/cli/pyobsd.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/cli/pyobsw.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/comm/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/comm/comm.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/comm/commlogging.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/comm/dummy/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/comm/dummy/dummycomm.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/comm/local/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/comm/local/localcomm.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/comm/local/localnetwork.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/comm/proxy.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/comm/xmpp/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/comm/xmpp/rpc.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/comm/xmpp/serializer.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/comm/xmpp/xep_0009/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/comm/xmpp/xep_0009/binding.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/comm/xmpp/xep_0009/rpc.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/comm/xmpp/xep_0009_timeout/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/comm/xmpp/xep_0009_timeout/rpc.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/comm/xmpp/xep_0009_timeout/stanza/RPC.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/comm/xmpp/xep_0009_timeout/stanza/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/comm/xmpp/xmppclient.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/comm/xmpp/xmppcomm.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/events/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/events/badweather.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/events/event.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/events/exposurestatuschanged.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/events/filterchanged.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/events/focusfound.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/events/goodweather.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/events/log.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/events/modechanged.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/events/moduleclosed.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/events/moduleopened.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/events/motionstatuschanged.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/events/move.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/events/newimage.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/events/newspectrum.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/events/offsets.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/events/roofclosing.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/events/roofopened.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/events/taskfailed.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/events/taskfinished.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/events/taskstarted.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/events/testevent.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/image.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/meta/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/meta/altazoffsets.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/meta/exptime.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/meta/genericoffset.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/meta/onskydistance.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/meta/pixeloffsets.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/meta/radecoffsets.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/meta/skyoffsets.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processor.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/_daobackgroundremover.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/annotation/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/annotation/_pillow.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/annotation/circle.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/annotation/crosshair.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/annotation/text.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/astrometry/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/astrometry/_dotnet_request.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/astrometry/_dotnet_request_builder.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/astrometry/_dotnet_request_logger.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/astrometry/_dotnet_response_saver.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/astrometry/astrometry.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/astrometry/dotnet.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/calibration/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/calibration/_calibration_cache.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/calibration/_ccddata_calibrator.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/calibration/calibration.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/detection/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/detection/_pysep_stats_calculator.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/detection/_source_catalog.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/detection/daophot.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/detection/pysep.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/detection/simpledisk.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/detection/sourcedetection.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/exptime/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/exptime/exptime.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/exptime/star.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/image/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/image/addfitsheaders.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/image/download.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/image/flip.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/image/grayscale.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/image/httpserver.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/image/normalize.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/image/save.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/image/saveimage.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/image/smooth.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/image/softbin.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/misc/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/misc/addmask.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/misc/catalogcircularmask.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/misc/circularmask.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/misc/createfilename.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/misc/imagesourcefilter.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/misc/removebackground.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/modules/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/modules/getfitsheaders.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/offsets/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/offsets/astrometry.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/offsets/brighteststar.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/offsets/brighteststar_guiding.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/offsets/dummyoffsets.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/offsets/dummyskyoffsets.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/offsets/fitsheader.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/offsets/offsets.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/offsets/pixeloffsets.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/offsets/projected.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/offsets/spilled_light.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/photometry/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/photometry/_photometry_calculator.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/photometry/_photutil_aperture_photometry.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/photometry/_sep_aperture_photometry.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/photometry/aperture_photometry.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/photometry/photometry.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/photometry/photutil.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/photometry/pysep.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/wcs/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/wcs/solarhelioprojective.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IAbortable.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IAcquisition.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IAutoFocus.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IAutoGuiding.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IAutonomous.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IBinning.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/ICalibrate.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/ICamera.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IConfig.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/ICooling.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IData.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IDataSequence.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IDome.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IExposure.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IExposureTime.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IFilters.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IFitsHeaderAfter.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IFitsHeaderBefore.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IFlatField.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IFocusModel.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IFocuser.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IGain.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IImageFormat.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IImageType.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IMode.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IModule.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IMotion.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IMultiFiber.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IOffsetsAltAz.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IOffsetsRaDec.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IPointingAltAz.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IPointingBody.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IPointingHeliocentricPolar.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IPointingHeliographicStonyhurst.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IPointingHelioprojective.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IPointingOrbitalElements.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IPointingRaDec.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IPointingSeries.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IReady.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IRoof.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IRotation.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IRunnable.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IRunning.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IScriptRunner.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/ISpectrograph.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IStartStop.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IStructuredConfig.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/ISyncTarget.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/ITelescope.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/ITemperatures.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/ITrackingMode.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/ITrackingRate.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IVideo.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IWeather.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/IWindow.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/interfaces/interface.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/mixins/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/mixins/camerasettings.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/mixins/fitsheader.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/mixins/fitsnamespace.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/mixins/follow.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/mixins/motionstatus.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/mixins/pipeline.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/mixins/waitformotion.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/mixins/weatheraware.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/camera/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/camera/adaptive.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/camera/basecamera.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/camera/basespectrograph.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/camera/basevideo.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/camera/dummycamera.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/camera/dummyspectrograph.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/camera/dummyvideo.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/camera/pipelinecamera.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/flatfield/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/flatfield/flatfield.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/flatfield/pointing.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/flatfield/scheduler.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/focus/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/focus/dummyautofocus.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/focus/focusmodel.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/focus/focusseries.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/image/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/image/imagewatcher.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/image/imagewriter.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/image/pipeline.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/image/seeing.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/module.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/pointing/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/pointing/_base.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/pointing/_baseguiding.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/pointing/acquisition.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/pointing/autoguiding.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/pointing/dummyacquisition.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/pointing/dummyguiding.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/pointing/guidingstatistics/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/pointing/guidingstatistics/guidingstatistics.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/pointing/guidingstatistics/pixeloffset.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/pointing/guidingstatistics/skyoffsets.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/pointing/guidingstatistics/uptime.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/pointing/scienceframeguiding.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/robotic/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/robotic/mastermind.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/robotic/pointing.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/robotic/scriptrunner.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/roof/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/roof/basedome.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/roof/baseroof.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/roof/dummyroof.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/telescope/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/telescope/_dummytelescopebase.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/telescope/basetelescope.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/telescope/dummyaltaztelescope.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/telescope/dummyradectelescope.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/telescope/dummysolartelescope.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/test/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/test/standalone.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/utils/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/utils/dummymode.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/utils/fluentlogger.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/utils/httpfilecache.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/utils/kiosk.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/utils/matrix.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/utils/stellarium.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/utils/telegram.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/utils/trigger.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/weather/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/weather/mockweather.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/weather/weather.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/weather/weather_api.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/modules/weather/weather_state.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/object.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/py.typed +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/_executor.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/astroplanscheduler.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/constraints/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/constraints/airmassconstraint.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/constraints/constraint.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/constraints/moonilluminationconstraint.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/constraints/moonseparationconstraint.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/constraints/solarelevationconstraint.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/constraints/timeconstraint.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/dataprovider.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/merits/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/merits/aftertime.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/merits/beforetime.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/merits/constant.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/merits/follow.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/merits/interval.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/merits/merit.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/merits/pernight.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/merits/random.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/merits/timewindow.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/merits/transit.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/observationarchiveevolution.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/ondemandscheduler.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/targets/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/targets/dynamictarget.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/targets/heliocentricpolartarget.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/targets/helioprojectivetarget.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/targets/picker/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/targets/picker/csvpicker.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/targets/picker/picker.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/targets/siderealtarget.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/targets/target.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scheduler/taskscheduler.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scripts/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scripts/calibration/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scripts/calibration/darkbias.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scripts/calibration/pointing.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scripts/calibration/skyflats.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scripts/control/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scripts/control/cases.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scripts/control/conditional.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scripts/control/parallel.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scripts/control/selector.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scripts/control/sequential.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scripts/exceptions.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scripts/imaging/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scripts/imaging/autofocus.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scripts/imaging/imaging.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scripts/imaging/transitimaging.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scripts/script.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scripts/utils/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scripts/utils/callmodule.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scripts/utils/debugtrigger.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/scripts/utils/log.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/storage/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/storage/filesystem/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/storage/filesystem/observationarchive.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/storage/filesystem/taskarchive.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/storage/lco/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/storage/lco/_portal.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/storage/lco/_schedulereader.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/storage/lco/_schedulewriter.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/storage/lco/configdb.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/storage/lco/mockobservationarchive.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/storage/lco/observationarchive.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/storage/lco/scripts/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/storage/lco/scripts/autofocus.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/storage/lco/scripts/default.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/storage/lco/scripts/script.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/storage/lco/task.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/storage/lco/taskarchive.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/storage/lco/taskrunner.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/storage/memory/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/storage/memory/observationarchive.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/storage/memory/taskarchive.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/storage/observationarchive.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/storage/taskarchive.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/taskrunner.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/utils/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/utils/archive/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/utils/archive/archive.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/utils/archive/local_archive.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/utils/archive/pyobs_archive.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/utils/exptime/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/utils/exptime/exptime.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/utils/exptime/stellarexptime.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/utils/skyflats/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/utils/skyflats/exptimeeval.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/utils/skyflats/flatfielder.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/utils/skyflats/pointing/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/utils/skyflats/pointing/base.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/utils/skyflats/pointing/static.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/utils/skyflats/priorities/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/utils/skyflats/priorities/archive.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/utils/skyflats/priorities/base.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/utils/skyflats/priorities/const.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/robotic/utils/skyflats/scheduler.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/average.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/cache.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/config.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/config_schema.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/coordinates.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/curvefit.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/enums.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/exceptions.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/fits.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/focusseries/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/focusseries/base.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/focusseries/photometry.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/focusseries/projection.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/grids/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/grids/filters.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/grids/grid.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/grids/gridnode.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/grids/pipeline.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/gui/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/gui/camera/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/gui/camera/binningwidget.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/gui/camera/datadisplaywidget.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/gui/camera/exposewidget.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/gui/camera/exposuretimewidget.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/gui/camera/imageformatwidget.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/gui/camera/listpickerdialog.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/gui/camera/windowingwidget.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/http.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/influxdb.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/logger.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/logging/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/logging/context.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/logging/resolvableerror.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/modulegui.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/offsets/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/offsets/applyaltazoffsets.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/offsets/applyoffsets.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/offsets/applyradecoffsets.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/parallel.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/pipeline/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/pipeline/pipeline.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/pipeline/progress.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/pipeline/reduction.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/pipeline/reduction_base.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/publisher/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/publisher/csv.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/publisher/http.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/publisher/log.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/publisher/multi.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/publisher/publisher.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/serialization.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/shellcommand.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/threads/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/threads/lockwithabort.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/time.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/units.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/utils/versions.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/version.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/vfs/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/vfs/archivefile.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/vfs/bufferedfile.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/vfs/file.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/vfs/filelists/__init__.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/vfs/filelists/filelist.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/vfs/filelists/testing.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/vfs/httpfile.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/vfs/localfile.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/vfs/memfile.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/vfs/sftpfile.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/vfs/smbfile.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/vfs/sshfile.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/vfs/tempfile.py +0 -0
- {pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/vfs/vfs.py +0 -0
|
@@ -102,7 +102,7 @@ class Scheduler(Module, IStartStop, IRunnable):
|
|
|
102
102
|
|
|
103
103
|
# get scheduler
|
|
104
104
|
self._task_archive = self.add_child_object(tasks, TaskArchive, on_tasks_changed=self._update_schedule)
|
|
105
|
-
#
|
|
105
|
+
# PortalObservationArchive declares auto_update and gates its own polling loop on it --
|
|
106
106
|
# since we already drive updates via on_tasks_changed above, that poller must stay off.
|
|
107
107
|
# Other ObservationArchive implementations (e.g. LcoObservationArchive) don't declare it at
|
|
108
108
|
# all, so it must not be injected unconditionally.
|
|
@@ -39,6 +39,12 @@ class Observation(BaseModel):
|
|
|
39
39
|
"""Per-night observation number, e.g. "20260810-001". Assigned by Mastermind when the
|
|
40
40
|
observation starts running; None before that (or if never observed)."""
|
|
41
41
|
|
|
42
|
+
archive_url: str | None = None
|
|
43
|
+
"""Link to this observation's data in the archive's own frontend, as serialized by
|
|
44
|
+
pyobs-portal (pyobs-portal#82). Portal-only UI metadata: Mastermind tolerates but never
|
|
45
|
+
consumes it -- it is always None for the pending/in_progress states Mastermind schedules
|
|
46
|
+
on, and is declared so the portal's payloads keep validating under ``extra="forbid"``."""
|
|
47
|
+
|
|
42
48
|
def __str__(self) -> str:
|
|
43
49
|
return (
|
|
44
50
|
f"Observation {self.id} of {self.task.name} (#{self.task.id}) "
|
|
@@ -15,8 +15,8 @@ from pyobs.utils.time import Time
|
|
|
15
15
|
log = logging.getLogger(__name__)
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
class
|
|
19
|
-
"""Observation archive based on pyobs-
|
|
18
|
+
class PortalObservationArchive(ObservationArchive):
|
|
19
|
+
"""Observation archive based on pyobs-portal."""
|
|
20
20
|
|
|
21
21
|
def __init__(
|
|
22
22
|
self,
|
|
@@ -39,12 +39,12 @@ class BackendObservationArchive(ObservationArchive):
|
|
|
39
39
|
self.add_background_task(self._check_for_changes)
|
|
40
40
|
|
|
41
41
|
async def open(self) -> None:
|
|
42
|
-
"""Opens the
|
|
42
|
+
"""Opens the portal observation archive."""
|
|
43
43
|
self._aiohttp_session = aiohttp.ClientSession(headers={"Authorization": f"Token {self._token}"})
|
|
44
44
|
await ObservationArchive.open(self)
|
|
45
45
|
|
|
46
46
|
async def close(self) -> None:
|
|
47
|
-
"""Closes the
|
|
47
|
+
"""Closes the portal observation archive."""
|
|
48
48
|
await ObservationArchive.close(self)
|
|
49
49
|
if self._aiohttp_session is not None:
|
|
50
50
|
await self._aiohttp_session.close()
|
|
@@ -57,20 +57,20 @@ class BackendObservationArchive(ObservationArchive):
|
|
|
57
57
|
return self._aiohttp_session
|
|
58
58
|
|
|
59
59
|
async def _check_for_changes(self) -> None:
|
|
60
|
-
"""Update schedule in background, gated on the
|
|
60
|
+
"""Update schedule in background, gated on the portal's update marker."""
|
|
61
61
|
|
|
62
62
|
while True:
|
|
63
63
|
try:
|
|
64
64
|
await self._poll()
|
|
65
65
|
except Exception as e:
|
|
66
|
-
log.error("Failed to update observations from
|
|
66
|
+
log.error("Failed to update observations from portal: %s", e)
|
|
67
67
|
await asyncio.sleep(5)
|
|
68
68
|
|
|
69
69
|
async def _poll(self) -> None:
|
|
70
|
-
"""Re-download the schedule when the
|
|
70
|
+
"""Re-download the schedule when the portal's ``last_observation_update`` marker moved.
|
|
71
71
|
|
|
72
|
-
The marker is a DB-derived ``Max(updated_at)`` (pyobs-
|
|
73
|
-
gunicorn workers, so it is a safe refresh gate; see ``
|
|
72
|
+
The marker is a DB-derived ``Max(updated_at)`` (pyobs-portal#84), truthful across
|
|
73
|
+
gunicorn workers, so it is a safe refresh gate; see ``PortalTaskArchive._poll``. The
|
|
74
74
|
content comparison in :meth:`_update` still decides whether to fire ``on_tasks_changed``.
|
|
75
75
|
"""
|
|
76
76
|
last_update = await self.last_update_time()
|
|
@@ -79,12 +79,12 @@ class BackendObservationArchive(ObservationArchive):
|
|
|
79
79
|
self._last_marker = last_update
|
|
80
80
|
|
|
81
81
|
async def _update(self) -> None:
|
|
82
|
-
"""Fetch the schedule from the
|
|
82
|
+
"""Fetch the schedule from the portal and apply it if anything changed.
|
|
83
83
|
|
|
84
|
-
Called by :meth:`_poll` after the
|
|
84
|
+
Called by :meth:`_poll` after the portal marker moved (or on the first poll). Changes are
|
|
85
85
|
detected by comparing full observation contents via ``model_dump(use_task_id=True)``,
|
|
86
86
|
keyed by observation ID so a stable reordering of the same items is not mistaken for a
|
|
87
|
-
change: the
|
|
87
|
+
change: the portal serializes ``task`` as a plain FK ID, while cached copies get their
|
|
88
88
|
``task`` replaced by a full ``Task`` when the mastermind calls ``fetch_task()``, so the ID
|
|
89
89
|
normalization keeps both sides comparable. The comparison includes ``state``
|
|
90
90
|
(``Observation.__eq__`` ignores it), which matters for in-set transitions such as
|
|
@@ -265,4 +265,4 @@ class BackendObservationArchive(ObservationArchive):
|
|
|
265
265
|
return ObservationList([self.pyobs_model_validate(Observation, obs) for obs in observations])
|
|
266
266
|
|
|
267
267
|
|
|
268
|
-
__all__ = ["
|
|
268
|
+
__all__ = ["PortalObservationArchive"]
|
|
@@ -13,14 +13,14 @@ from pyobs.utils.time import Time
|
|
|
13
13
|
log = logging.getLogger(__name__)
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
class
|
|
17
|
-
"""Task archive based on pyobs-
|
|
16
|
+
class PortalTaskArchive(TaskArchive):
|
|
17
|
+
"""Task archive based on pyobs-portal."""
|
|
18
18
|
|
|
19
19
|
def __init__(self, url: str, token: str, auto_update: bool = True, **kwargs: Any):
|
|
20
20
|
"""Creates a new task archive.
|
|
21
21
|
|
|
22
22
|
Args:
|
|
23
|
-
url: URL of pyobs-
|
|
23
|
+
url: URL of pyobs-portal.
|
|
24
24
|
token: Auth token.
|
|
25
25
|
"""
|
|
26
26
|
TaskArchive.__init__(self, **kwargs)
|
|
@@ -36,12 +36,12 @@ class BackendTaskArchive(TaskArchive):
|
|
|
36
36
|
self.add_background_task(self._check_for_changes)
|
|
37
37
|
|
|
38
38
|
async def open(self) -> None:
|
|
39
|
-
"""Opens the
|
|
39
|
+
"""Opens the portal task archive."""
|
|
40
40
|
self._aiohttp_session = aiohttp.ClientSession(headers={"Authorization": f"Token {self._token}"})
|
|
41
41
|
await TaskArchive.open(self)
|
|
42
42
|
|
|
43
43
|
async def close(self) -> None:
|
|
44
|
-
"""Closes the
|
|
44
|
+
"""Closes the portal task archive."""
|
|
45
45
|
await TaskArchive.close(self)
|
|
46
46
|
if self._aiohttp_session is not None:
|
|
47
47
|
await self._aiohttp_session.close()
|
|
@@ -54,18 +54,18 @@ class BackendTaskArchive(TaskArchive):
|
|
|
54
54
|
return self._aiohttp_session
|
|
55
55
|
|
|
56
56
|
async def _check_for_changes(self) -> None:
|
|
57
|
-
"""Update tasks in background, gated on the
|
|
57
|
+
"""Update tasks in background, gated on the portal's update marker."""
|
|
58
58
|
while True:
|
|
59
59
|
try:
|
|
60
60
|
await self._poll()
|
|
61
61
|
except Exception as e:
|
|
62
|
-
log.error("Failed to update tasks from
|
|
62
|
+
log.error("Failed to update tasks from portal: %s", e)
|
|
63
63
|
await asyncio.sleep(5)
|
|
64
64
|
|
|
65
65
|
async def _poll(self) -> None:
|
|
66
|
-
"""Re-download tasks/projects when the
|
|
66
|
+
"""Re-download tasks/projects when the portal's ``last_task_update`` marker moved.
|
|
67
67
|
|
|
68
|
-
The marker is a DB-derived ``Max(updated_at)`` (pyobs-
|
|
68
|
+
The marker is a DB-derived ``Max(updated_at)`` (pyobs-portal#84), truthful across
|
|
69
69
|
gunicorn workers, so it is a safe refresh gate. Without it the archive re-downloaded (and
|
|
70
70
|
re-compared) on every poll, and the content comparison misfired whenever runtime code
|
|
71
71
|
mutated a serialized task field (e.g. ``DynamicTarget.resolve()`` overwriting ``name``),
|
|
@@ -78,14 +78,14 @@ class BackendTaskArchive(TaskArchive):
|
|
|
78
78
|
self._last_marker = last_update
|
|
79
79
|
|
|
80
80
|
async def _update(self) -> None:
|
|
81
|
-
"""Fetch tasks/projects from the
|
|
81
|
+
"""Fetch tasks/projects from the portal and apply them if anything changed.
|
|
82
82
|
|
|
83
|
-
Called by :meth:`_poll` after the
|
|
83
|
+
Called by :meth:`_poll` after the portal marker moved (or on the first poll); applies the
|
|
84
84
|
download only when the content actually differs from the cached copy. The comparison uses
|
|
85
85
|
``model_dump()`` rather than pydantic ``==``, which also compares runtime attributes (e.g.
|
|
86
86
|
``Task._cant_run_reason`` set by ``can_run()``) and would flag unchanged tasks as changed
|
|
87
87
|
on every poll; it is keyed by ID so that a stable reordering of the same items (e.g. an
|
|
88
|
-
unordered
|
|
88
|
+
unordered portal queryset) is not mistaken for a change.
|
|
89
89
|
"""
|
|
90
90
|
projects = await self._get_projects()
|
|
91
91
|
tasks = await self._get_tasks()
|
|
@@ -105,12 +105,12 @@ class BackendTaskArchive(TaskArchive):
|
|
|
105
105
|
return Time(res["last_task_update"])
|
|
106
106
|
|
|
107
107
|
async def _get_projects(self) -> list[Project]:
|
|
108
|
-
"""Fetch projects from
|
|
108
|
+
"""Fetch projects from portal."""
|
|
109
109
|
projects = await http_request_paginated(self._session, urljoin(self._url, "/api/projects/"), strict=True)
|
|
110
110
|
return [self.pyobs_model_validate(Project, project) for project in projects]
|
|
111
111
|
|
|
112
112
|
async def _get_tasks(self) -> list[Task]:
|
|
113
|
-
"""Fetch tasks from
|
|
113
|
+
"""Fetch tasks from portal."""
|
|
114
114
|
tasks = await http_request_paginated(self._session, urljoin(self._url, "/api/tasks/"), strict=True)
|
|
115
115
|
return [self.pyobs_model_validate(Task, task) for task in tasks]
|
|
116
116
|
|
|
@@ -118,7 +118,7 @@ class BackendTaskArchive(TaskArchive):
|
|
|
118
118
|
"""Returns time when last time any tasks changed (as observed by this archive).
|
|
119
119
|
|
|
120
120
|
This is the local time at which the last content change was detected by the polling loop,
|
|
121
|
-
not the
|
|
121
|
+
not the portal's marker timestamp -- the marker is per-process and unreliable.
|
|
122
122
|
"""
|
|
123
123
|
return self._last_update
|
|
124
124
|
|
|
@@ -151,4 +151,4 @@ class BackendTaskArchive(TaskArchive):
|
|
|
151
151
|
return None
|
|
152
152
|
|
|
153
153
|
|
|
154
|
-
__all__ = ["
|
|
154
|
+
__all__ = ["PortalTaskArchive"]
|
|
@@ -46,9 +46,9 @@ class Task(PolymorphicBaseModel):
|
|
|
46
46
|
script: dict[str, Any] = Field(default_factory=dict)
|
|
47
47
|
active: bool = True
|
|
48
48
|
updated_at: str | None = None
|
|
49
|
-
"""Last-modification timestamp as emitted by pyobs-
|
|
50
|
-
added in pyobs-
|
|
51
|
-
model (``extra="forbid"``) accepts the field the
|
|
49
|
+
"""Last-modification timestamp as emitted by pyobs-portal (DB-derived ``updated_at``,
|
|
50
|
+
added in pyobs-portal#84). Carried for round-trip fidelity so the strict ``Task``
|
|
51
|
+
model (``extra="forbid"``) accepts the field the portal now sends; not used by pyobs itself."""
|
|
52
52
|
|
|
53
53
|
_resolved_target: Target | None = PrivateAttr(default=None)
|
|
54
54
|
_cant_run_reason: str | None = None
|
|
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.dev95 → pyobs_core-2.0.0.dev98}/pyobs/comm/xmpp/xep_0009_timeout/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/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
|
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/_daobackgroundremover.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/annotation/__init__.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/annotation/_pillow.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/annotation/circle.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/annotation/crosshair.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/annotation/text.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/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.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/astrometry/astrometry.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/astrometry/dotnet.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/calibration/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/calibration/calibration.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/detection/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/detection/daophot.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/detection/pysep.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/detection/simpledisk.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/exptime/__init__.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/exptime/exptime.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/image/addfitsheaders.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/image/grayscale.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/image/httpserver.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/image/normalize.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/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.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/misc/circularmask.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/misc/createfilename.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/misc/imagesourcefilter.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/misc/removebackground.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/modules/__init__.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/modules/getfitsheaders.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/offsets/__init__.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/offsets/astrometry.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/offsets/brighteststar.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/offsets/dummyoffsets.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/offsets/dummyskyoffsets.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/offsets/fitsheader.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/offsets/offsets.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/offsets/pixeloffsets.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/offsets/projected.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/offsets/spilled_light.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/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.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/photometry/photometry.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/pyobs/images/processors/photometry/photutil.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev95 → pyobs_core-2.0.0.dev98}/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
|