gpp-client 26.5.0.dev1__tar.gz → 26.5.1.dev1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/PKG-INFO +2 -2
  2. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/pyproject.toml +9 -12
  3. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/client.py +2 -0
  4. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/domains/scheduler.py +19 -1
  5. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/__init__.py +32 -4
  6. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/client.py +41 -0
  7. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/custom_fields.py +22 -2
  8. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/enums.py +18 -1
  9. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/input_types.py +31 -11
  10. gpp_client-26.5.1.dev1/src/gpp_client/generated/scheduler_observations_updates.py +76 -0
  11. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/.gitignore +0 -0
  12. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/LICENSE +0 -0
  13. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/README.md +0 -0
  14. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/graphql/README.md +0 -0
  15. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/__init__.py +0 -0
  16. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/cli/__init__.py +0 -0
  17. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/cli/cli.py +0 -0
  18. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/cli/commands/__init__.py +0 -0
  19. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/cli/commands/attachment.py +0 -0
  20. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/cli/commands/goats.py +0 -0
  21. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/cli/commands/observation.py +0 -0
  22. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/cli/commands/program.py +0 -0
  23. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/cli/commands/scheduler.py +0 -0
  24. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/cli/commands/site_status.py +0 -0
  25. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/cli/commands/target.py +0 -0
  26. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/cli/commands/workflow_state.py +0 -0
  27. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/cli/console.py +0 -0
  28. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/cli/output.py +0 -0
  29. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/cli/utils.py +0 -0
  30. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/constants.py +0 -0
  31. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/domains/__init__.py +0 -0
  32. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/domains/atom.py +0 -0
  33. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/domains/attachment.py +0 -0
  34. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/domains/base.py +0 -0
  35. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/domains/goats.py +0 -0
  36. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/domains/observation.py +0 -0
  37. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/domains/program.py +0 -0
  38. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/domains/site_status.py +0 -0
  39. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/domains/target.py +0 -0
  40. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/domains/workflow_state.py +0 -0
  41. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/environment.py +0 -0
  42. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/exceptions.py +0 -0
  43. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/async_base_client.py +0 -0
  44. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/base_model.py +0 -0
  45. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/base_operation.py +0 -0
  46. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/clone_observation.py +0 -0
  47. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/clone_target.py +0 -0
  48. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/create_call_for_proposals.py +0 -0
  49. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/create_observation.py +0 -0
  50. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/create_program.py +0 -0
  51. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/create_target_by_program_id.py +0 -0
  52. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/create_target_by_program_reference.py +0 -0
  53. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/create_target_by_proposal_reference.py +0 -0
  54. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/custom_mutations.py +0 -0
  55. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/custom_queries.py +0 -0
  56. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/custom_typing_fields.py +0 -0
  57. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/delete_call_for_proposals_by_id.py +0 -0
  58. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/delete_observation_by_id.py +0 -0
  59. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/delete_observation_by_reference.py +0 -0
  60. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/delete_program_by_id.py +0 -0
  61. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/delete_target_by_id.py +0 -0
  62. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/exceptions.py +0 -0
  63. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/fragments.py +0 -0
  64. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/get_call_for_proposals.py +0 -0
  65. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/get_calls_for_proposals.py +0 -0
  66. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/get_goats_observations.py +0 -0
  67. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/get_goats_programs.py +0 -0
  68. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/get_observation.py +0 -0
  69. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/get_observation_attachments_by_id.py +0 -0
  70. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/get_observation_attachments_by_reference.py +0 -0
  71. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/get_observation_workflow_state_by_id.py +0 -0
  72. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/get_observation_workflow_state_by_reference.py +0 -0
  73. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/get_observations.py +0 -0
  74. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/get_program_attachments_by_id.py +0 -0
  75. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/get_program_attachments_by_proposal_reference.py +0 -0
  76. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/get_program_attachments_by_reference.py +0 -0
  77. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/get_program_by_id.py +0 -0
  78. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/get_program_by_proposal_reference.py +0 -0
  79. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/get_program_by_reference.py +0 -0
  80. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/get_programs.py +0 -0
  81. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/get_scheduler_all_programs_id.py +0 -0
  82. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/get_scheduler_programs.py +0 -0
  83. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/get_target_by_id.py +0 -0
  84. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/get_targets.py +0 -0
  85. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/obs_calculation_update.py +0 -0
  86. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/observation_edit.py +0 -0
  87. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/package_environment.py +0 -0
  88. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/ping.py +0 -0
  89. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/program_edit.py +0 -0
  90. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/restore_call_for_proposals_by_id.py +0 -0
  91. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/restore_observation_by_id.py +0 -0
  92. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/restore_observation_by_reference.py +0 -0
  93. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/restore_program_by_id.py +0 -0
  94. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/restore_target_by_id.py +0 -0
  95. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/set_observation_workflow_state.py +0 -0
  96. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/target_edit.py +0 -0
  97. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/update_call_for_proposals_by_id.py +0 -0
  98. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/update_calls_for_proposals.py +0 -0
  99. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/update_observation_by_id.py +0 -0
  100. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/update_observation_by_reference.py +0 -0
  101. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/update_observations.py +0 -0
  102. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/update_program_by_id.py +0 -0
  103. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/update_programs.py +0 -0
  104. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/update_target_by_id.py +0 -0
  105. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/generated/update_targets.py +0 -0
  106. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/logging_utils.py +0 -0
  107. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/rest/__init__.py +0 -0
  108. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/rest/client.py +0 -0
  109. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/rest/utils.py +0 -0
  110. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/settings.py +0 -0
  111. {gpp_client-26.5.0.dev1 → gpp_client-26.5.1.dev1}/src/gpp_client/urls.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gpp-client
3
- Version: 26.5.0.dev1
3
+ Version: 26.5.1.dev1
4
4
  Summary: Gemini Program Platform client.
5
5
  Project-URL: Homepage, https://github.com/gemini-hlsw/gpp-client
6
6
  Project-URL: Source, https://github.com/gemini-hlsw/gpp-client
@@ -44,7 +44,7 @@ Classifier: Programming Language :: Python :: 3.13
44
44
  Classifier: Programming Language :: Python :: 3.14
45
45
  Classifier: Topic :: Scientific/Engineering :: Astronomy
46
46
  Requires-Python: >=3.11.0
47
- Requires-Dist: aiohttp>=3.13.3
47
+ Requires-Dist: aiohttp>=3.13.4
48
48
  Requires-Dist: beautifulsoup4>=4.11.0
49
49
  Requires-Dist: graphql-core>=3.2.0
50
50
  Requires-Dist: httpx>=0.23
@@ -21,7 +21,7 @@ classifiers = [
21
21
  "Topic :: Scientific/Engineering :: Astronomy",
22
22
  ]
23
23
  dependencies = [
24
- "aiohttp>=3.13.3",
24
+ "aiohttp>=3.13.4",
25
25
  "beautifulsoup4>=4.11.0",
26
26
  "graphql-core>=3.2.0",
27
27
  "httpx>=0.23",
@@ -41,6 +41,10 @@ style = "pep440"
41
41
  pattern = '^v(?P<base>\d{2}\.\d{1,2}\.\d+)(?:\.(?P<stage>dev)(?P<revision>\d+))?$'
42
42
  strict = true
43
43
  metadata = false
44
+ fallback-version = "0.0.0"
45
+
46
+ [tool.uv]
47
+ cache-keys = [{ file = "pyproject.toml" }, { git = { commit = true, tags = true }}]
44
48
 
45
49
  [tool.hatch.build.targets.wheel]
46
50
  packages = ["src/gpp_client"]
@@ -95,13 +99,13 @@ codegen = [
95
99
  dev = [
96
100
  { include-group = "codegen" },
97
101
  "polyfactory>=3.2.0",
98
- "pytest>=9.0.1",
102
+ "pytest>=9.0.3",
99
103
  "pytest-asyncio>=1.3.0",
100
- "pytest-cov>=7.0.0",
104
+ "pytest-cov>=7.1.0",
101
105
  "pytest-mock>=3.15.1",
102
106
  "pytest-remotedata>=0.4.1",
103
107
  "pytest-xdist>=3.8.0",
104
- "ruff>=0.15.0",
108
+ "ruff>=0.15.12",
105
109
  ]
106
110
  docs = [
107
111
  "furo==2025.12.19",
@@ -110,14 +114,7 @@ docs = [
110
114
  "sphinx-copybutton>=0.5.2",
111
115
  "sphinxcontrib-typer>=0.7.2",
112
116
  ]
113
- notebook = [
114
- "ipykernel>=7.2.0",
115
- "jupyter>=1.1.1",
116
- ]
117
- schema = [
118
- "aiohttp>=3.13.3",
119
- "gql>=3.5.0,<4.0.0",
120
- ]
117
+ schema = [{ include-group = "codegen" }]
121
118
 
122
119
  [project.urls]
123
120
  Homepage = "https://github.com/gemini-hlsw/gpp-client"
@@ -142,6 +142,8 @@ class GPPClient:
142
142
  url=graphql_url,
143
143
  headers=headers,
144
144
  ws_url=ws_url,
145
+ ws_headers=headers,
146
+ ws_connection_init_payload=headers,
145
147
  )
146
148
 
147
149
  def _build_rest_client(self) -> RESTClient:
@@ -5,9 +5,10 @@ Module for retrieving scheduler information.
5
5
  __all__ = ["SchedulerDomain"]
6
6
 
7
7
  from datetime import datetime
8
- from typing import Any
8
+ from typing import Any, AsyncIterator
9
9
 
10
10
  from gpp_client.domains.base import BaseDomain
11
+ from gpp_client.generated import SchedulerObservationsUpdates
11
12
  from gpp_client.generated.get_scheduler_all_programs_id import (
12
13
  GetSchedulerAllProgramsId,
13
14
  )
@@ -278,3 +279,20 @@ class SchedulerDomain(BaseDomain):
278
279
  today = datetime.today().date().isoformat() if date is None else date
279
280
  response = await self.get_program_ids(today=today)
280
281
  return [(p.reference.label, p.id) for p in response.programs.matches]
282
+
283
+ async def subscribe_to_calculation_updates(
284
+ self,
285
+ ) -> AsyncIterator[SchedulerObservationsUpdates]:
286
+ """
287
+ Subscribe to observation calculation update events with the
288
+ execution flag set to true so only executed events are sent.
289
+
290
+ Yields
291
+ ------
292
+ SchedulerObservationsUpdates
293
+ Observation calculation update events.
294
+ """
295
+ async for event in self._graphql.scheduler_observations_updates(
296
+ executable_only=True
297
+ ):
298
+ yield event
@@ -154,12 +154,15 @@ from .enums import (
154
154
  GnirsFpuSlit,
155
155
  GnirsGrating,
156
156
  GnirsPrism,
157
+ GnirsReadMode,
158
+ GnirsWellDepth,
157
159
  GuideProbe,
158
160
  GuideState,
159
161
  HiiRegionSpectrum,
160
162
  Ignore,
161
163
  Igrins2OffsetMode,
162
164
  ImageQualityPreset,
165
+ ImagingCapability,
163
166
  Instrument,
164
167
  ItcType,
165
168
  LineFluxIntegratedUnits,
@@ -192,7 +195,7 @@ from .enums import (
192
195
  SkyBackground,
193
196
  SlewStage,
194
197
  SmartGcalType,
195
- SpectroscopyCapabilities,
198
+ SpectroscopyCapability,
196
199
  StellarLibrarySpectrum,
197
200
  StepExecutionState,
198
201
  StepStage,
@@ -988,11 +991,12 @@ from .input_types import (
988
991
  WhereOptionEqCalibrationRole,
989
992
  WhereOptionEqEducationalStatus,
990
993
  WhereOptionEqGender,
994
+ WhereOptionEqImagingCapability,
991
995
  WhereOptionEqInstrument,
992
996
  WhereOptionEqPartner,
993
997
  WhereOptionEqQaState,
994
998
  WhereOptionEqSite,
995
- WhereOptionEqSpectroscopyCapabilities,
999
+ WhereOptionEqSpectroscopyCapability,
996
1000
  WhereOptionEqTacCategory,
997
1001
  WhereOptionOrderScienceBand,
998
1002
  WhereOptionString,
@@ -1123,6 +1127,17 @@ from .restore_target_by_id import (
1123
1127
  RestoreTargetByIdUpdateTargetsTargets,
1124
1128
  RestoreTargetByIdUpdateTargetsTargetsProgram,
1125
1129
  )
1130
+ from .scheduler_observations_updates import (
1131
+ SchedulerObservationsUpdates,
1132
+ SchedulerObservationsUpdatesObscalcUpdate,
1133
+ SchedulerObservationsUpdatesObscalcUpdateValue,
1134
+ SchedulerObservationsUpdatesObscalcUpdateValueExecution,
1135
+ SchedulerObservationsUpdatesObscalcUpdateValueExecutionVisits,
1136
+ SchedulerObservationsUpdatesObscalcUpdateValueExecutionVisitsMatches,
1137
+ SchedulerObservationsUpdatesObscalcUpdateValueExecutionVisitsMatchesAtomRecords,
1138
+ SchedulerObservationsUpdatesObscalcUpdateValueExecutionVisitsMatchesAtomRecordsMatches,
1139
+ SchedulerObservationsUpdatesObscalcUpdateValueExecutionVisitsMatchesObservation,
1140
+ )
1126
1141
  from .set_observation_workflow_state import (
1127
1142
  SetObservationWorkflowState,
1128
1143
  SetObservationWorkflowStateSetObservationWorkflowState,
@@ -1830,6 +1845,8 @@ __all__ = [
1830
1845
  "GnirsFpuSlit",
1831
1846
  "GnirsGrating",
1832
1847
  "GnirsPrism",
1848
+ "GnirsReadMode",
1849
+ "GnirsWellDepth",
1833
1850
  "GoaPropertiesInput",
1834
1851
  "GraphQLClient",
1835
1852
  "GraphQLClientError",
@@ -1852,6 +1869,7 @@ __all__ = [
1852
1869
  "Igrins2StaticInput",
1853
1870
  "Igrins2StepInput",
1854
1871
  "ImageQualityPreset",
1872
+ "ImagingCapability",
1855
1873
  "ImagingScienceRequirementsInput",
1856
1874
  "Instrument",
1857
1875
  "ItcType",
@@ -2038,6 +2056,15 @@ __all__ = [
2038
2056
  "RevokeUserInvitationInput",
2039
2057
  "RightAscensionArcInput",
2040
2058
  "RightAscensionInput",
2059
+ "SchedulerObservationsUpdates",
2060
+ "SchedulerObservationsUpdatesObscalcUpdate",
2061
+ "SchedulerObservationsUpdatesObscalcUpdateValue",
2062
+ "SchedulerObservationsUpdatesObscalcUpdateValueExecution",
2063
+ "SchedulerObservationsUpdatesObscalcUpdateValueExecutionVisits",
2064
+ "SchedulerObservationsUpdatesObscalcUpdateValueExecutionVisitsMatches",
2065
+ "SchedulerObservationsUpdatesObscalcUpdateValueExecutionVisitsMatchesAtomRecords",
2066
+ "SchedulerObservationsUpdatesObscalcUpdateValueExecutionVisitsMatchesAtomRecordsMatches",
2067
+ "SchedulerObservationsUpdatesObscalcUpdateValueExecutionVisitsMatchesObservation",
2041
2068
  "ScienceBand",
2042
2069
  "ScienceMode",
2043
2070
  "ScienceRequirementsDetails",
@@ -2066,7 +2093,7 @@ __all__ = [
2066
2093
  "SourceProfileInput",
2067
2094
  "SpectralDefinitionIntegratedInput",
2068
2095
  "SpectralDefinitionSurfaceInput",
2069
- "SpectroscopyCapabilities",
2096
+ "SpectroscopyCapability",
2070
2097
  "SpectroscopyScienceRequirementsInput",
2071
2098
  "SpiralTelescopeConfigGeneratorInput",
2072
2099
  "StellarLibrarySpectrum",
@@ -2216,11 +2243,12 @@ __all__ = [
2216
2243
  "WhereOptionEqCalibrationRole",
2217
2244
  "WhereOptionEqEducationalStatus",
2218
2245
  "WhereOptionEqGender",
2246
+ "WhereOptionEqImagingCapability",
2219
2247
  "WhereOptionEqInstrument",
2220
2248
  "WhereOptionEqPartner",
2221
2249
  "WhereOptionEqQaState",
2222
2250
  "WhereOptionEqSite",
2223
- "WhereOptionEqSpectroscopyCapabilities",
2251
+ "WhereOptionEqSpectroscopyCapability",
2224
2252
  "WhereOptionEqTacCategory",
2225
2253
  "WhereOptionOrderScienceBand",
2226
2254
  "WhereOptionString",
@@ -80,6 +80,7 @@ from .restore_observation_by_id import RestoreObservationById
80
80
  from .restore_observation_by_reference import RestoreObservationByReference
81
81
  from .restore_program_by_id import RestoreProgramById
82
82
  from .restore_target_by_id import RestoreTargetById
83
+ from .scheduler_observations_updates import SchedulerObservationsUpdates
83
84
  from .set_observation_workflow_state import SetObservationWorkflowState
84
85
  from .target_edit import TargetEdit
85
86
  from .update_call_for_proposals_by_id import UpdateCallForProposalsById
@@ -98,6 +99,46 @@ def gql(q: str) -> str:
98
99
 
99
100
 
100
101
  class GraphQLClient(AsyncBaseClient):
102
+ async def scheduler_observations_updates(
103
+ self, executable_only: Union[Optional[bool], UnsetType] = UNSET, **kwargs: Any
104
+ ) -> AsyncIterator[SchedulerObservationsUpdates]:
105
+ query = gql("""
106
+ subscription SchedulerObservationsUpdates($executableOnly: Boolean) {
107
+ obscalcUpdate(input: {executableOnly: $executableOnly}) {
108
+ oldCalculationState
109
+ newCalculationState
110
+ editType
111
+ value {
112
+ id
113
+ observationTime
114
+ execution {
115
+ visits {
116
+ matches {
117
+ observation {
118
+ id
119
+ }
120
+ atomRecords {
121
+ matches {
122
+ executionState
123
+ id
124
+ }
125
+ }
126
+ }
127
+ }
128
+ }
129
+ }
130
+ }
131
+ }
132
+ """)
133
+ variables: dict[str, object] = {"executableOnly": executable_only}
134
+ async for data in self.execute_ws(
135
+ query=query,
136
+ operation_name="SchedulerObservationsUpdates",
137
+ variables=variables,
138
+ **kwargs,
139
+ ):
140
+ yield SchedulerObservationsUpdates.model_validate(data)
141
+
101
142
  async def get_observation_attachments_by_id(
102
143
  self, observation_id: Any, **kwargs: Any
103
144
  ) -> GetObservationAttachmentsById:
@@ -4302,6 +4302,11 @@ class GhostIfuFields(GraphQLField):
4302
4302
  """Blue detector config."""
4303
4303
  return GhostDetectorConfigFields("blue")
4304
4304
 
4305
+ @classmethod
4306
+ def sky_position(cls) -> "CoordinatesFields":
4307
+ """Sky position, if any."""
4308
+ return CoordinatesFields("skyPosition")
4309
+
4305
4310
  @classmethod
4306
4311
  def slit_viewing_camera_exposure_time(cls) -> "TimeSpanFields":
4307
4312
  """Slit viewing camera exposure time (if specified)."""
@@ -4331,7 +4336,10 @@ class GhostIfuFields(GraphQLField):
4331
4336
  def fields(
4332
4337
  self,
4333
4338
  *subfields: Union[
4334
- GhostIfuGraphQLField, "GhostDetectorConfigFields", "TimeSpanFields"
4339
+ GhostIfuGraphQLField,
4340
+ "CoordinatesFields",
4341
+ "GhostDetectorConfigFields",
4342
+ "TimeSpanFields",
4335
4343
  ],
4336
4344
  ) -> "GhostIfuFields":
4337
4345
  """Subfields should come from the GhostIfuFields class"""
@@ -6212,8 +6220,16 @@ class Igrins2DynamicFields(GraphQLField):
6212
6220
  """IGRINS-2 exposure time"""
6213
6221
  return TimeSpanFields("exposure")
6214
6222
 
6223
+ @classmethod
6224
+ def central_wavelength(cls) -> "WavelengthFields":
6225
+ """Central wavelength, which is fixed at 2.1 microns."""
6226
+ return WavelengthFields("centralWavelength")
6227
+
6215
6228
  def fields(
6216
- self, *subfields: Union[Igrins2DynamicGraphQLField, "TimeSpanFields"]
6229
+ self,
6230
+ *subfields: Union[
6231
+ Igrins2DynamicGraphQLField, "TimeSpanFields", "WavelengthFields"
6232
+ ],
6217
6233
  ) -> "Igrins2DynamicFields":
6218
6234
  """Subfields should come from the Igrins2DynamicFields class"""
6219
6235
  self._subfields.extend(subfields)
@@ -6441,6 +6457,10 @@ class ImagingConfigOptionFields(GraphQLField):
6441
6457
  adaptive_optics: "ImagingConfigOptionGraphQLField" = (
6442
6458
  ImagingConfigOptionGraphQLField("adaptiveOptics")
6443
6459
  )
6460
+ capability: "ImagingConfigOptionGraphQLField" = ImagingConfigOptionGraphQLField(
6461
+ "capability"
6462
+ )
6463
+ "A special capability (if any) that the configuration may have."
6444
6464
  site: "ImagingConfigOptionGraphQLField" = ImagingConfigOptionGraphQLField("site")
6445
6465
 
6446
6466
  @classmethod
@@ -876,6 +876,18 @@ class GnirsFpuSlit(str, Enum):
876
876
  LONG_SLIT_1_00 = "LONG_SLIT_1_00"
877
877
 
878
878
 
879
+ class GnirsReadMode(str, Enum):
880
+ VERY_BRIGHT = "VERY_BRIGHT"
881
+ BRIGHT = "BRIGHT"
882
+ FAINT = "FAINT"
883
+ VERY_FAINT = "VERY_FAINT"
884
+
885
+
886
+ class GnirsWellDepth(str, Enum):
887
+ SHALLOW = "SHALLOW"
888
+ DEEP = "DEEP"
889
+
890
+
879
891
  class ItcType(str, Enum):
880
892
  GHOST_IFU = "GHOST_IFU"
881
893
  GMOS_NORTH_IMAGING = "GMOS_NORTH_IMAGING"
@@ -1037,7 +1049,12 @@ class SlewStage(str, Enum):
1037
1049
  END_SLEW = "END_SLEW"
1038
1050
 
1039
1051
 
1040
- class SpectroscopyCapabilities(str, Enum):
1052
+ class ImagingCapability(str, Enum):
1053
+ SPECKLE = "SPECKLE"
1054
+ WIDE_FIELD = "WIDE_FIELD"
1055
+
1056
+
1057
+ class SpectroscopyCapability(str, Enum):
1041
1058
  NOD_AND_SHUFFLE = "NOD_AND_SHUFFLE"
1042
1059
  POLARIMETRY = "POLARIMETRY"
1043
1060
  CORONAGRAPHY = "CORONAGRAPHY"
@@ -78,6 +78,7 @@ from .enums import (
78
78
  Ignore,
79
79
  Igrins2OffsetMode,
80
80
  ImageQualityPreset,
81
+ ImagingCapability,
81
82
  Instrument,
82
83
  LineFluxIntegratedUnits,
83
84
  LineFluxSurfaceUnits,
@@ -102,7 +103,7 @@ from .enums import (
102
103
  SkyBackground,
103
104
  SlewStage,
104
105
  SmartGcalType,
105
- SpectroscopyCapabilities,
106
+ SpectroscopyCapability,
106
107
  StellarLibrarySpectrum,
107
108
  StepStage,
108
109
  TacCategory,
@@ -1801,7 +1802,7 @@ class SpectroscopyScienceRequirementsInput(BaseModel):
1801
1802
  alias=str("focalPlaneAngle"), default=None
1802
1803
  )
1803
1804
  "The focalPlaneAngle field may be unset by assigning a null value, or ignored by skipping it altogether"
1804
- capability: Optional[SpectroscopyCapabilities] = None
1805
+ capability: Optional[SpectroscopyCapability] = None
1805
1806
  "The capabilities field may be unset by assigning a null value, or ignored by skipping it altogether"
1806
1807
 
1807
1808
 
@@ -2462,6 +2463,10 @@ class GhostIfuInput(BaseModel):
2462
2463
  "Red config. If not specified, defaults will be applied. Cannot be unset with\na null value."
2463
2464
  blue: Optional["GhostDetectorConfigInput"] = None
2464
2465
  "Blue config. If not specified, defaults will be applied. Cannot be unset with\na null value."
2466
+ sky_position: Optional["CoordinatesInput"] = Field(
2467
+ alias=str("skyPosition"), default=None
2468
+ )
2469
+ "Coordinates for taking sky images. When specified, the observation is\nconsidered to be a Target + Sky and is validated to ensure that only a single\ntarget exists in its asterism. If not specified, this will remain null. May\nbe unset with a null value."
2465
2470
  slit_viewing_camera_exposure_time: Optional["TimeSpanInput"] = Field(
2466
2471
  alias=str("slitViewingCameraExposureTime"), default=None
2467
2472
  )
@@ -3358,21 +3363,35 @@ class WhereEqScienceSubtype(BaseModel):
3358
3363
  "Matches if the subtype is none of the supplied values."
3359
3364
 
3360
3365
 
3361
- class WhereOptionEqSpectroscopyCapabilities(BaseModel):
3362
- """Filters on equality (or not) of the SpectroscopyCapabilities property. All
3366
+ class WhereOptionEqImagingCapability(BaseModel):
3367
+ """Filters on equality (or not) of the ImagingCapability property. All
3368
+ supplied criteria must match, but usually only one is selected."""
3369
+
3370
+ is_null: Optional[bool] = Field(alias=str("IS_NULL"), default=None)
3371
+ "When `true`, matches if the imaging capability value is not defined."
3372
+ eq: Optional[ImagingCapability] = Field(alias=str("EQ"), default=None)
3373
+ "Matches if the imaging capability is the supplied value."
3374
+ neq: Optional[ImagingCapability] = Field(alias=str("NEQ"), default=None)
3375
+ "Matches if the imaging capability is anything other than the supplied\nvalue."
3376
+ in_: Optional[list[ImagingCapability]] = Field(alias=str("IN"), default=None)
3377
+ "Matches if the imaging capability is any one of the supplied values."
3378
+ nin: Optional[list[ImagingCapability]] = Field(alias=str("NIN"), default=None)
3379
+ "Matches if the imaging capability is not any one of the supplied values."
3380
+
3381
+
3382
+ class WhereOptionEqSpectroscopyCapability(BaseModel):
3383
+ """Filters on equality (or not) of the SpectroscopyCapability property. All
3363
3384
  supplied criteria must match, but usually only one is selected."""
3364
3385
 
3365
3386
  is_null: Optional[bool] = Field(alias=str("IS_NULL"), default=None)
3366
3387
  "When `true`, matches if the spectroscopy capability value is not defined."
3367
- eq: Optional[SpectroscopyCapabilities] = Field(alias=str("EQ"), default=None)
3388
+ eq: Optional[SpectroscopyCapability] = Field(alias=str("EQ"), default=None)
3368
3389
  "Matches if the spectroscopy capability is the supplied value."
3369
- neq: Optional[SpectroscopyCapabilities] = Field(alias=str("NEQ"), default=None)
3390
+ neq: Optional[SpectroscopyCapability] = Field(alias=str("NEQ"), default=None)
3370
3391
  "Matches if the spectroscopy capability is anything other than the supplied\nvalue."
3371
- in_: Optional[list[SpectroscopyCapabilities]] = Field(alias=str("IN"), default=None)
3392
+ in_: Optional[list[SpectroscopyCapability]] = Field(alias=str("IN"), default=None)
3372
3393
  "Matches if the spectroscopy capability is any one of the supplied values."
3373
- nin: Optional[list[SpectroscopyCapabilities]] = Field(
3374
- alias=str("NIN"), default=None
3375
- )
3394
+ nin: Optional[list[SpectroscopyCapability]] = Field(alias=str("NIN"), default=None)
3376
3395
  "Matches if the spectroscopy capability is not any one of the supplied values."
3377
3396
 
3378
3397
 
@@ -4210,7 +4229,7 @@ class WhereSpectroscopyConfigOption(BaseModel):
4210
4229
  adaptive_optics: Optional["WhereBoolean"] = Field(
4211
4230
  alias=str("adaptiveOptics"), default=None
4212
4231
  )
4213
- capability: Optional["WhereOptionEqSpectroscopyCapabilities"] = None
4232
+ capability: Optional["WhereOptionEqSpectroscopyCapability"] = None
4214
4233
  focal_plane: Optional["WhereEqFocalPlane"] = Field(
4215
4234
  alias=str("focalPlane"), default=None
4216
4235
  )
@@ -4249,6 +4268,7 @@ class WhereImagingConfigOption(BaseModel):
4249
4268
  instrument: Optional["WhereEqInstrument"] = None
4250
4269
  fov: Optional["WhereAngle"] = None
4251
4270
  site: Optional["WhereEqSite"] = None
4271
+ capability: Optional["WhereOptionEqImagingCapability"] = None
4252
4272
 
4253
4273
 
4254
4274
  class WhereString(BaseModel):
@@ -0,0 +1,76 @@
1
+ from typing import Any, Optional
2
+
3
+ from pydantic import Field
4
+
5
+ from .base_model import BaseModel
6
+ from .enums import AtomExecutionState, CalculationState, EditType
7
+
8
+
9
+ class SchedulerObservationsUpdates(BaseModel):
10
+ obscalc_update: "SchedulerObservationsUpdatesObscalcUpdate" = Field(
11
+ alias="obscalcUpdate"
12
+ )
13
+
14
+
15
+ class SchedulerObservationsUpdatesObscalcUpdate(BaseModel):
16
+ old_calculation_state: Optional[CalculationState] = Field(
17
+ alias="oldCalculationState"
18
+ )
19
+ new_calculation_state: Optional[CalculationState] = Field(
20
+ alias="newCalculationState"
21
+ )
22
+ edit_type: EditType = Field(alias="editType")
23
+ value: Optional["SchedulerObservationsUpdatesObscalcUpdateValue"]
24
+
25
+
26
+ class SchedulerObservationsUpdatesObscalcUpdateValue(BaseModel):
27
+ id: Any
28
+ observation_time: Optional[Any] = Field(alias="observationTime")
29
+ execution: "SchedulerObservationsUpdatesObscalcUpdateValueExecution"
30
+
31
+
32
+ class SchedulerObservationsUpdatesObscalcUpdateValueExecution(BaseModel):
33
+ visits: "SchedulerObservationsUpdatesObscalcUpdateValueExecutionVisits"
34
+
35
+
36
+ class SchedulerObservationsUpdatesObscalcUpdateValueExecutionVisits(BaseModel):
37
+ matches: list[
38
+ "SchedulerObservationsUpdatesObscalcUpdateValueExecutionVisitsMatches"
39
+ ]
40
+
41
+
42
+ class SchedulerObservationsUpdatesObscalcUpdateValueExecutionVisitsMatches(BaseModel):
43
+ observation: "SchedulerObservationsUpdatesObscalcUpdateValueExecutionVisitsMatchesObservation"
44
+ atom_records: "SchedulerObservationsUpdatesObscalcUpdateValueExecutionVisitsMatchesAtomRecords" = Field(
45
+ alias="atomRecords"
46
+ )
47
+
48
+
49
+ class SchedulerObservationsUpdatesObscalcUpdateValueExecutionVisitsMatchesObservation(
50
+ BaseModel
51
+ ):
52
+ id: Any
53
+
54
+
55
+ class SchedulerObservationsUpdatesObscalcUpdateValueExecutionVisitsMatchesAtomRecords(
56
+ BaseModel
57
+ ):
58
+ matches: list[
59
+ "SchedulerObservationsUpdatesObscalcUpdateValueExecutionVisitsMatchesAtomRecordsMatches"
60
+ ]
61
+
62
+
63
+ class SchedulerObservationsUpdatesObscalcUpdateValueExecutionVisitsMatchesAtomRecordsMatches(
64
+ BaseModel
65
+ ):
66
+ execution_state: AtomExecutionState = Field(alias="executionState")
67
+ id: Any
68
+
69
+
70
+ SchedulerObservationsUpdates.model_rebuild()
71
+ SchedulerObservationsUpdatesObscalcUpdate.model_rebuild()
72
+ SchedulerObservationsUpdatesObscalcUpdateValue.model_rebuild()
73
+ SchedulerObservationsUpdatesObscalcUpdateValueExecution.model_rebuild()
74
+ SchedulerObservationsUpdatesObscalcUpdateValueExecutionVisits.model_rebuild()
75
+ SchedulerObservationsUpdatesObscalcUpdateValueExecutionVisitsMatches.model_rebuild()
76
+ SchedulerObservationsUpdatesObscalcUpdateValueExecutionVisitsMatchesAtomRecords.model_rebuild()