pyobs-core 2.0.0.dev15__tar.gz → 2.0.0.dev17__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.dev15 → pyobs_core-2.0.0.dev17}/PKG-INFO +1 -1
- pyobs_core-2.0.0.dev17/pyobs/interfaces/IStructuredConfig.py +47 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/__init__.py +5 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/camera/basevideo.py +12 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/utils/httpfilecache.py +18 -1
- pyobs_core-2.0.0.dev17/pyobs/robotic/scheduler/targets/__init__.py +7 -0
- pyobs_core-2.0.0.dev15/pyobs/robotic/scheduler/targets/heliocentricpolar.py → pyobs_core-2.0.0.dev17/pyobs/robotic/scheduler/targets/heliocentricpolartarget.py +2 -2
- pyobs_core-2.0.0.dev15/pyobs/robotic/scheduler/targets/helioprojectiveradialarget.py → pyobs_core-2.0.0.dev17/pyobs/robotic/scheduler/targets/helioprojectivetarget.py +9 -9
- pyobs_core-2.0.0.dev17/pyobs/utils/config_schema.py +128 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyproject.toml +1 -1
- pyobs_core-2.0.0.dev15/pyobs/robotic/scheduler/targets/__init__.py +0 -7
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/.gitignore +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/LICENSE +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/application.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/background_task.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/cli/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/cli/_cli.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/cli/pyobs.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/cli/pyobsd.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/cli/pyobsw.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/comm.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/commlogging.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/dummy/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/dummy/dummycomm.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/local/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/local/localcomm.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/local/localnetwork.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/proxy.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/xmpp/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/xmpp/rpc.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/xmpp/serializer.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/xmpp/xep_0009/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/xmpp/xep_0009/binding.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/xmpp/xep_0009/rpc.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/xmpp/xep_0009_timeout/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/xmpp/xep_0009_timeout/rpc.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/xmpp/xep_0009_timeout/stanza/RPC.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/xmpp/xep_0009_timeout/stanza/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/xmpp/xmppclient.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/xmpp/xmppcomm.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/badweather.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/event.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/exposurestatuschanged.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/filterchanged.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/focusfound.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/goodweather.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/log.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/modechanged.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/moduleclosed.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/moduleopened.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/motionstatuschanged.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/move.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/newimage.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/newspectrum.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/offsets.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/roofclosing.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/roofopened.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/taskfailed.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/taskfinished.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/taskstarted.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/events/testevent.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/image.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/meta/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/meta/altazoffsets.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/meta/exptime.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/meta/genericoffset.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/meta/onskydistance.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/meta/pixeloffsets.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/meta/radecoffsets.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/meta/skyoffsets.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processor.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/_daobackgroundremover.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/annotation/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/annotation/_pillow.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/annotation/circle.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/annotation/crosshair.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/annotation/text.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/astrometry/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/astrometry/_dotnet_request.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/astrometry/_dotnet_request_builder.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/astrometry/_dotnet_request_logger.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/astrometry/_dotnet_response_saver.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/astrometry/astrometry.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/astrometry/dotnet.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/calibration/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/calibration/_calibration_cache.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/calibration/_ccddata_calibrator.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/calibration/calibration.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/detection/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/detection/_pysep_stats_calculator.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/detection/_source_catalog.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/detection/daophot.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/detection/pysep.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/detection/simpledisk.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/detection/sourcedetection.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/exptime/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/exptime/exptime.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/exptime/star.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/image/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/image/addfitsheaders.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/image/download.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/image/flip.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/image/grayscale.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/image/httpserver.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/image/normalize.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/image/save.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/image/saveimage.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/image/smooth.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/image/softbin.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/misc/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/misc/addmask.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/misc/catalogcircularmask.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/misc/circularmask.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/misc/createfilename.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/misc/imagesourcefilter.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/misc/removebackground.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/modules/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/modules/getfitsheaders.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/offsets/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/offsets/astrometry.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/offsets/brighteststar.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/offsets/brighteststar_guiding.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/offsets/dummyoffsets.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/offsets/dummyskyoffsets.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/offsets/fitsheader.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/offsets/offsets.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/offsets/pixeloffsets.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/offsets/projected.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/offsets/spilled_light.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/photometry/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/photometry/_photometry_calculator.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/photometry/_photutil_aperture_photometry.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/photometry/_sep_aperture_photometry.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/photometry/aperture_photometry.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/photometry/photometry.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/photometry/photutil.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/photometry/pysep.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/wcs/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/wcs/solarhelioprojective.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IAbortable.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IAcquisition.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IAutoFocus.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IAutoGuiding.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IAutonomous.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IBinning.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/ICalibrate.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/ICamera.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IConfig.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/ICooling.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IData.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IDome.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IExposure.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IExposureTime.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IFilters.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IFitsHeaderAfter.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IFitsHeaderBefore.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IFlatField.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IFocusModel.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IFocuser.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IGain.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IImageFormat.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IImageType.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IMode.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IModule.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IMotion.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IMultiFiber.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IOffsetsAltAz.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IOffsetsRaDec.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IPointingAltAz.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IPointingHGS.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IPointingHelioprojective.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IPointingRaDec.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IPointingSeries.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IReady.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IRoof.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IRotation.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IRunnable.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IRunning.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IScriptRunner.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/ISpectrograph.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IStartStop.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/ISyncTarget.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/ITelescope.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/ITemperatures.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IVideo.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IWeather.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/IWindow.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/interfaces/interface.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/mixins/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/mixins/camerasettings.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/mixins/fitsheader.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/mixins/fitsnamespace.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/mixins/follow.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/mixins/motionstatus.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/mixins/pipeline.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/mixins/waitformotion.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/mixins/weatheraware.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/camera/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/camera/adaptive.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/camera/basecamera.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/camera/basespectrograph.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/camera/dummycamera.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/camera/dummyspectrograph.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/camera/dummyvideo.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/camera/pipelinecamera.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/flatfield/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/flatfield/flatfield.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/flatfield/pointing.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/flatfield/scheduler.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/focus/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/focus/dummyautofocus.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/focus/focusmodel.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/focus/focusseries.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/image/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/image/imagewatcher.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/image/imagewriter.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/image/pipeline.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/image/seeing.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/module.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/pointing/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/pointing/_base.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/pointing/_baseguiding.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/pointing/acquisition.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/pointing/autoguiding.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/pointing/dummyacquisition.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/pointing/dummyguiding.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/pointing/guidingstatistics/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/pointing/guidingstatistics/guidingstatistics.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/pointing/guidingstatistics/pixeloffset.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/pointing/guidingstatistics/skyoffsets.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/pointing/guidingstatistics/uptime.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/pointing/scienceframeguiding.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/robotic/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/robotic/mastermind.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/robotic/pointing.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/robotic/scheduler.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/robotic/scriptrunner.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/roof/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/roof/basedome.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/roof/baseroof.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/roof/dummyroof.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/telescope/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/telescope/basetelescope.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/telescope/dummytelescope.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/test/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/test/standalone.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/utils/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/utils/autonomouswarning.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/utils/dummymode.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/utils/fluentlogger.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/utils/kiosk.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/utils/matrix.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/utils/stellarium.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/utils/telegram.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/utils/trigger.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/weather/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/weather/mockweather.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/weather/weather.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/weather/weather_api.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/modules/weather/weather_state.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/object.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/py.typed +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/observation.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/astroplanscheduler.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/constraints/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/constraints/airmassconstraint.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/constraints/constraint.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/constraints/moonilluminationconstraint.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/constraints/moonseparationconstraint.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/constraints/solarelevationconstraint.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/constraints/timeconstraint.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/dataprovider.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/merits/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/merits/aftertime.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/merits/beforetime.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/merits/constant.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/merits/follow.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/merits/interval.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/merits/merit.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/merits/pernight.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/merits/random.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/merits/timewindow.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/merits/transit.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/observationarchiveevolution.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/ondemandscheduler.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/targets/dynamictarget.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/targets/picker/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/targets/picker/csvpicker.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/targets/picker/picker.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/targets/siderealtarget.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/targets/target.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scheduler/taskscheduler.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/calibration/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/calibration/darkbias.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/calibration/pointing.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/calibration/skyflats.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/control/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/control/cases.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/control/conditional.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/control/parallel.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/control/selector.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/control/sequential.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/imaging/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/imaging/autofocus.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/imaging/imaging.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/imaging/transitimaging.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/script.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/utils/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/utils/callmodule.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/utils/debugtrigger.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/scripts/utils/log.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/backend/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/backend/observationarchive.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/backend/taskarchive.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/filesystem/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/filesystem/observationarchive.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/filesystem/taskarchive.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/lco/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/lco/_portal.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/lco/_schedulereader.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/lco/_schedulewriter.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/lco/configdb.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/lco/mockobservationarchive.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/lco/observationarchive.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/lco/scripts/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/lco/scripts/autofocus.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/lco/scripts/default.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/lco/scripts/script.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/lco/task.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/lco/taskarchive.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/lco/taskrunner.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/memory/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/memory/observationarchive.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/memory/taskarchive.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/observationarchive.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/storage/taskarchive.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/task.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/taskrunner.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/archive/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/archive/archive.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/archive/local_archive.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/archive/pyobs_archive.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/exptime/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/exptime/exptime.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/exptime/stellarexptime.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/skyflats/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/skyflats/exptimeeval.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/skyflats/flatfielder.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/skyflats/pointing/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/skyflats/pointing/base.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/skyflats/pointing/static.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/skyflats/priorities/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/skyflats/priorities/archive.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/skyflats/priorities/base.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/skyflats/priorities/const.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/robotic/utils/skyflats/scheduler.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/average.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/cache.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/config.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/coordinates.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/curvefit.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/enums.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/exceptions.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/fits.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/focusseries/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/focusseries/base.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/focusseries/photometry.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/focusseries/projection.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/grids/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/grids/filters.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/grids/grid.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/grids/gridnode.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/grids/pipeline.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/gui/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/gui/camera/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/gui/camera/binningwidget.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/gui/camera/datadisplaywidget.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/gui/camera/exposewidget.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/gui/camera/exposuretimewidget.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/gui/camera/imageformatwidget.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/gui/camera/listpickerdialog.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/gui/camera/windowingwidget.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/http.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/influxdb.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/logger.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/logging/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/logging/context.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/logging/resolvableerror.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/modulegui.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/offsets/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/offsets/applyaltazoffsets.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/offsets/applyoffsets.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/offsets/applyradecoffsets.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/parallel.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/pipeline/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/pipeline/night.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/pipeline/pipeline.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/publisher/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/publisher/csv.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/publisher/http.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/publisher/log.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/publisher/multi.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/publisher/publisher.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/serialization.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/shellcommand.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/threads/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/threads/lockwithabort.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/time.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/utils/units.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/version.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/vfs/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/vfs/archivefile.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/vfs/bufferedfile.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/vfs/file.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/vfs/filelists/__init__.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/vfs/filelists/filelist.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/vfs/filelists/testing.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/vfs/httpfile.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/vfs/localfile.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/vfs/memfile.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/vfs/sftpfile.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/vfs/smbfile.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/vfs/sshfile.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/vfs/tempfile.py +0 -0
- {pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/vfs/vfs.py +0 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from abc import ABCMeta, abstractmethod
|
|
4
|
+
from dataclasses import dataclass, field
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from ..utils.config_schema import ConfigFieldSchema, ConfigSchema # re-export
|
|
8
|
+
from ..utils.time import Time
|
|
9
|
+
from .IConfig import ConfigScalar
|
|
10
|
+
from .interface import Interface
|
|
11
|
+
|
|
12
|
+
ConfigValue = ConfigScalar | list["ConfigValue"] | dict[str, "ConfigValue"]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass
|
|
16
|
+
class ConfigAppliedState:
|
|
17
|
+
config: dict[str, ConfigValue]
|
|
18
|
+
time: Time = field(default_factory=Time.now)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class IStructuredConfig(Interface, metaclass=ABCMeta):
|
|
22
|
+
"""The module accepts a whole structured (possibly nested) config
|
|
23
|
+
object in one call, rather than per-field get/set (see IConfig for
|
|
24
|
+
the per-field variant)."""
|
|
25
|
+
|
|
26
|
+
__module__ = "pyobs.interfaces"
|
|
27
|
+
|
|
28
|
+
capabilities = ConfigSchema
|
|
29
|
+
state = ConfigAppliedState
|
|
30
|
+
|
|
31
|
+
@abstractmethod
|
|
32
|
+
async def set_config(self, config: dict[str, ConfigValue], **kwargs: Any) -> None:
|
|
33
|
+
"""Apply a full structured config to this module.
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
config: Nested dict matching this module's ConfigSchema
|
|
37
|
+
(fetch via get_capabilities). Values are validated and
|
|
38
|
+
deserialized into the module's internal config dataclass.
|
|
39
|
+
|
|
40
|
+
Raises:
|
|
41
|
+
ValueError: If config doesn't match the module's schema, or
|
|
42
|
+
values fail validation.
|
|
43
|
+
"""
|
|
44
|
+
...
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
__all__ = ["IStructuredConfig", "ConfigAppliedState", "ConfigSchema", "ConfigFieldSchema"]
|
|
@@ -55,6 +55,7 @@ from .IRunning import IRunning, RunningState
|
|
|
55
55
|
from .IScriptRunner import IScriptRunner
|
|
56
56
|
from .ISpectrograph import ISpectrograph
|
|
57
57
|
from .IStartStop import IStartStop
|
|
58
|
+
from .IStructuredConfig import ConfigAppliedState, ConfigFieldSchema, ConfigSchema, IStructuredConfig
|
|
58
59
|
from .ISyncTarget import ISyncTarget
|
|
59
60
|
from .ITelescope import ITelescope
|
|
60
61
|
from .ITemperatures import ITemperatures, SensorReading, TemperaturesState
|
|
@@ -142,6 +143,10 @@ __all__ = [
|
|
|
142
143
|
"RunningState",
|
|
143
144
|
"IScriptRunner",
|
|
144
145
|
"IStartStop",
|
|
146
|
+
"IStructuredConfig",
|
|
147
|
+
"ConfigAppliedState",
|
|
148
|
+
"ConfigSchema",
|
|
149
|
+
"ConfigFieldSchema",
|
|
145
150
|
"ISyncTarget",
|
|
146
151
|
"ITelescope",
|
|
147
152
|
"ITemperatures",
|
|
@@ -147,6 +147,7 @@ class BaseVideo(Module, ImageFitsHeaderMixin, IVideo, IImageType, metaclass=ABCM
|
|
|
147
147
|
self._app.add_routes(
|
|
148
148
|
[
|
|
149
149
|
web.get("/", self.web_handler),
|
|
150
|
+
web.get("/ping", self.ping_handler),
|
|
150
151
|
web.get("/video.mjpg", self.video_handler),
|
|
151
152
|
web.get("/{filename}", self.image_handler),
|
|
152
153
|
]
|
|
@@ -194,6 +195,17 @@ class BaseVideo(Module, ImageFitsHeaderMixin, IVideo, IImageType, metaclass=ABCM
|
|
|
194
195
|
"""
|
|
195
196
|
return web.Response(text=INDEX_HTML, content_type="text/html")
|
|
196
197
|
|
|
198
|
+
async def ping_handler(self, request: web.Request) -> web.Response:
|
|
199
|
+
"""Handles GET access to /ping for testing connectivity.
|
|
200
|
+
|
|
201
|
+
Args:
|
|
202
|
+
request: Request to respond to.
|
|
203
|
+
|
|
204
|
+
Returns:
|
|
205
|
+
Response with a JSON status.
|
|
206
|
+
"""
|
|
207
|
+
return web.json_response({"status": "ok"})
|
|
208
|
+
|
|
197
209
|
async def video_handler(self, request: web.Request) -> web.StreamResponse:
|
|
198
210
|
"""Handles access to /video.mjpg and returns the video.
|
|
199
211
|
|
|
@@ -34,7 +34,13 @@ class HttpFileCache(Module):
|
|
|
34
34
|
|
|
35
35
|
# define web server
|
|
36
36
|
self._app = web.Application(client_max_size=self._max_file_size)
|
|
37
|
-
self._app.add_routes(
|
|
37
|
+
self._app.add_routes(
|
|
38
|
+
[
|
|
39
|
+
web.get("/ping", self.ping_handler),
|
|
40
|
+
web.get("/{filename}", self.download_handler),
|
|
41
|
+
web.post("/", self.upload_handler),
|
|
42
|
+
]
|
|
43
|
+
)
|
|
38
44
|
self._runner = web.AppRunner(self._app)
|
|
39
45
|
self._site: web.TCPSite | None = None
|
|
40
46
|
|
|
@@ -61,6 +67,17 @@ class HttpFileCache(Module):
|
|
|
61
67
|
"""Whether the server is started."""
|
|
62
68
|
return self._is_listening
|
|
63
69
|
|
|
70
|
+
async def ping_handler(self, request: web.Request) -> web.Response:
|
|
71
|
+
"""Handles GET access to /ping for testing connectivity.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
request: Request to respond to.
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
Response with a JSON status.
|
|
78
|
+
"""
|
|
79
|
+
return web.json_response({"status": "ok"})
|
|
80
|
+
|
|
64
81
|
async def download_handler(self, request: web.Request) -> web.Response:
|
|
65
82
|
"""Handles GET access to /{filename} and returns image.
|
|
66
83
|
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
from .dynamictarget import DynamicTarget
|
|
2
|
+
from .heliocentricpolartarget import HeliocentricPolarTarget
|
|
3
|
+
from .helioprojectivetarget import HelioprojectiveTarget
|
|
4
|
+
from .siderealtarget import SiderealTarget
|
|
5
|
+
from .target import Target
|
|
6
|
+
|
|
7
|
+
__all__ = ["Target", "DynamicTarget", "HeliocentricPolarTarget", "HelioprojectiveTarget", "SiderealTarget"]
|
|
@@ -7,7 +7,7 @@ from pyobs.utils.time import Time
|
|
|
7
7
|
from .target import Target
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
class
|
|
10
|
+
class HeliocentricPolarTarget(Target):
|
|
11
11
|
mu: float
|
|
12
12
|
psi: float
|
|
13
13
|
|
|
@@ -37,4 +37,4 @@ class HeliocentricPolar(Target):
|
|
|
37
37
|
return f"{self.name} ({self.coord})"
|
|
38
38
|
|
|
39
39
|
|
|
40
|
-
__all__ = ["
|
|
40
|
+
__all__ = ["HeliocentricPolarTarget"]
|
|
@@ -5,22 +5,22 @@ from pyobs.utils.time import Time
|
|
|
5
5
|
from .target import Target
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
class
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
class HelioprojectiveTarget(Target):
|
|
9
|
+
tx: float
|
|
10
|
+
ty: float
|
|
11
11
|
|
|
12
12
|
@property
|
|
13
13
|
def coord(self) -> SkyCoord:
|
|
14
14
|
return self.coordinates(Time.now())
|
|
15
15
|
|
|
16
16
|
def coordinates(self, time: Time) -> SkyCoord:
|
|
17
|
-
from sunpy.coordinates import
|
|
17
|
+
from sunpy.coordinates import Helioprojective
|
|
18
18
|
|
|
19
19
|
return SkyCoord(
|
|
20
|
-
self.
|
|
21
|
-
self.
|
|
22
|
-
unit="
|
|
23
|
-
frame=
|
|
20
|
+
self.tx,
|
|
21
|
+
self.ty,
|
|
22
|
+
unit="arcsec",
|
|
23
|
+
frame=Helioprojective,
|
|
24
24
|
observer="earth",
|
|
25
25
|
obstime=time,
|
|
26
26
|
)
|
|
@@ -29,4 +29,4 @@ class HelioprojectiveRadialTarget(Target):
|
|
|
29
29
|
return f"{self.name} ({self.coord})"
|
|
30
30
|
|
|
31
31
|
|
|
32
|
-
__all__ = ["
|
|
32
|
+
__all__ = ["HelioprojectiveTarget"]
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import dataclasses
|
|
4
|
+
import enum
|
|
5
|
+
import functools
|
|
6
|
+
import types
|
|
7
|
+
import typing
|
|
8
|
+
from typing import Annotated, Any, get_args, get_origin, get_type_hints
|
|
9
|
+
|
|
10
|
+
from pydantic import BaseModel
|
|
11
|
+
from pydantic_core import PydanticUndefined
|
|
12
|
+
|
|
13
|
+
from pyobs.utils.enums import Unit
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dataclasses.dataclass
|
|
17
|
+
class ConfigFieldSchema:
|
|
18
|
+
type: str
|
|
19
|
+
unit: Unit | None = None
|
|
20
|
+
options: list[str] | None = None
|
|
21
|
+
default: Any | None = None
|
|
22
|
+
nested: dict[str, ConfigFieldSchema] | None = None
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@dataclasses.dataclass
|
|
26
|
+
class ConfigSchema:
|
|
27
|
+
fields: dict[str, ConfigFieldSchema]
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@functools.cache
|
|
31
|
+
def dataclass_to_schema(cls: type) -> ConfigSchema:
|
|
32
|
+
"""Recursively derive a ConfigSchema from a dataclass type.
|
|
33
|
+
|
|
34
|
+
Handles: plain scalars (str/int/float/bool), Enum-typed fields (→
|
|
35
|
+
type="enum" with `options`), Annotated[T, Unit.X] (→ populates `unit`),
|
|
36
|
+
and nested dataclasses (→ type="object" with `nested`).
|
|
37
|
+
Raises a clear error for unsupported field types rather than silently
|
|
38
|
+
guessing — this schema is consumed by GUI rendering code, silent
|
|
39
|
+
fallbacks there are worse than a loud failure here.
|
|
40
|
+
"""
|
|
41
|
+
if not dataclasses.is_dataclass(cls):
|
|
42
|
+
raise TypeError(f"Not a dataclass: {cls!r}")
|
|
43
|
+
|
|
44
|
+
hints = get_type_hints(cls, include_extras=True)
|
|
45
|
+
fields: dict[str, ConfigFieldSchema] = {}
|
|
46
|
+
for f in dataclasses.fields(cls):
|
|
47
|
+
fields[f.name] = _field_schema(hints[f.name], f.default)
|
|
48
|
+
return ConfigSchema(fields=fields)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _field_schema(annotation: Any, default: Any) -> ConfigFieldSchema:
|
|
52
|
+
unit = None
|
|
53
|
+
origin = get_origin(annotation)
|
|
54
|
+
if origin is Annotated:
|
|
55
|
+
annotation, *extras = get_args(annotation)
|
|
56
|
+
unit = next((e for e in extras if isinstance(e, Unit)), None)
|
|
57
|
+
|
|
58
|
+
if dataclasses.is_dataclass(annotation):
|
|
59
|
+
nested_schema = dataclass_to_schema(annotation)
|
|
60
|
+
return ConfigFieldSchema(type="object", nested=nested_schema.fields)
|
|
61
|
+
|
|
62
|
+
if isinstance(annotation, type) and issubclass(annotation, enum.Enum):
|
|
63
|
+
return ConfigFieldSchema(
|
|
64
|
+
type="enum",
|
|
65
|
+
options=[e.value for e in annotation],
|
|
66
|
+
default=default if default is not dataclasses.MISSING else None,
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
type_name = {str: "str", int: "int", float: "float", bool: "bool"}.get(annotation)
|
|
70
|
+
if type_name is None:
|
|
71
|
+
raise TypeError(f"Unsupported config field type for schema: {annotation!r}")
|
|
72
|
+
|
|
73
|
+
return ConfigFieldSchema(
|
|
74
|
+
type=type_name,
|
|
75
|
+
unit=unit,
|
|
76
|
+
default=default if default is not dataclasses.MISSING else None,
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
@functools.cache
|
|
81
|
+
def pydantic_to_schema(cls: type[BaseModel]) -> ConfigSchema:
|
|
82
|
+
"""Recursively derive a ConfigSchema from a Pydantic BaseModel.
|
|
83
|
+
|
|
84
|
+
Counterpart to dataclass_to_schema, for config objects that need to be
|
|
85
|
+
Pydantic models (e.g. for their own validation) rather than plain
|
|
86
|
+
dataclasses. Handles: plain scalars (str/int/float/bool), Literal-typed
|
|
87
|
+
fields (-> type="enum" with `options`), Optional[...]/`X | None`
|
|
88
|
+
(unwrapped), nested BaseModel fields (-> type="object" with `nested`),
|
|
89
|
+
and opaque `dict` fields (-> type="object" with no nested schema, for
|
|
90
|
+
freeform blobs). Raises for anything else unhandled, for the same
|
|
91
|
+
reason as dataclass_to_schema: this schema drives GUI rendering, and a
|
|
92
|
+
silent fallback there is worse than a loud failure here.
|
|
93
|
+
"""
|
|
94
|
+
if not (isinstance(cls, type) and issubclass(cls, BaseModel)):
|
|
95
|
+
raise TypeError(f"Not a Pydantic model: {cls!r}")
|
|
96
|
+
|
|
97
|
+
fields: dict[str, ConfigFieldSchema] = {}
|
|
98
|
+
for name, info in cls.model_fields.items():
|
|
99
|
+
default = None if info.default is PydanticUndefined else info.default
|
|
100
|
+
fields[name] = _pydantic_field_schema(info.annotation, default)
|
|
101
|
+
return ConfigSchema(fields=fields)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def _pydantic_field_schema(annotation: Any, default: Any) -> ConfigFieldSchema:
|
|
105
|
+
origin = get_origin(annotation)
|
|
106
|
+
|
|
107
|
+
if origin is typing.Union or origin is types.UnionType:
|
|
108
|
+
args = [a for a in get_args(annotation) if a is not type(None)]
|
|
109
|
+
if len(args) == 1:
|
|
110
|
+
return _pydantic_field_schema(args[0], default)
|
|
111
|
+
|
|
112
|
+
if origin is typing.Literal:
|
|
113
|
+
return ConfigFieldSchema(type="enum", options=[str(v) for v in get_args(annotation)], default=default)
|
|
114
|
+
|
|
115
|
+
if isinstance(annotation, type) and issubclass(annotation, BaseModel):
|
|
116
|
+
return ConfigFieldSchema(type="object", nested=pydantic_to_schema(annotation).fields)
|
|
117
|
+
|
|
118
|
+
if annotation is dict or origin is dict:
|
|
119
|
+
return ConfigFieldSchema(type="object", default=default)
|
|
120
|
+
|
|
121
|
+
type_name = {str: "str", int: "int", float: "float", bool: "bool"}.get(annotation)
|
|
122
|
+
if type_name is None:
|
|
123
|
+
raise TypeError(f"Unsupported config field type for schema: {annotation!r}")
|
|
124
|
+
|
|
125
|
+
return ConfigFieldSchema(type=type_name, default=default)
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
__all__ = ["ConfigFieldSchema", "ConfigSchema", "dataclass_to_schema", "pydantic_to_schema"]
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
from .dynamictarget import DynamicTarget
|
|
2
|
-
from .heliocentricpolar import HeliocentricPolar
|
|
3
|
-
from .helioprojectiveradialarget import HelioprojectiveRadialTarget
|
|
4
|
-
from .siderealtarget import SiderealTarget
|
|
5
|
-
from .target import Target
|
|
6
|
-
|
|
7
|
-
__all__ = ["Target", "DynamicTarget", "HeliocentricPolar", "HelioprojectiveRadialTarget", "SiderealTarget"]
|
|
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.dev15 → pyobs_core-2.0.0.dev17}/pyobs/comm/xmpp/xep_0009_timeout/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/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.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/_daobackgroundremover.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/annotation/__init__.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/annotation/_pillow.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/annotation/circle.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/annotation/crosshair.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/annotation/text.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/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.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/astrometry/astrometry.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/astrometry/dotnet.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/calibration/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/calibration/calibration.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/detection/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/detection/daophot.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/detection/pysep.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/detection/simpledisk.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/exptime/__init__.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/exptime/exptime.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/image/addfitsheaders.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/image/grayscale.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/image/httpserver.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/image/normalize.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/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.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/misc/circularmask.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev15 → pyobs_core-2.0.0.dev17}/pyobs/images/processors/misc/createfilename.py
RENAMED
|
File without changes
|