gpp-client 26.4.1.dev1__tar.gz → 26.5.0.dev2__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 (175) hide show
  1. gpp_client-26.5.0.dev2/.gitignore +178 -0
  2. {gpp_client-26.4.1.dev1/src/gpp_client.egg-info → gpp_client-26.5.0.dev2}/PKG-INFO +11 -14
  3. gpp_client-26.5.0.dev2/graphql/README.md +39 -0
  4. {gpp_client-26.4.1.dev1 → gpp_client-26.5.0.dev2}/pyproject.toml +34 -27
  5. gpp_client-26.5.0.dev2/src/gpp_client/__init__.py +47 -0
  6. {gpp_client-26.4.1.dev1 → gpp_client-26.5.0.dev2}/src/gpp_client/cli/cli.py +45 -37
  7. gpp_client-26.5.0.dev2/src/gpp_client/cli/commands/__init__.py +23 -0
  8. gpp_client-26.5.0.dev2/src/gpp_client/cli/commands/attachment.py +97 -0
  9. gpp_client-26.5.0.dev2/src/gpp_client/cli/commands/goats.py +56 -0
  10. gpp_client-26.5.0.dev2/src/gpp_client/cli/commands/observation.py +97 -0
  11. gpp_client-26.5.0.dev2/src/gpp_client/cli/commands/program.py +117 -0
  12. gpp_client-26.5.0.dev2/src/gpp_client/cli/commands/scheduler.py +52 -0
  13. gpp_client-26.5.0.dev2/src/gpp_client/cli/commands/site_status.py +37 -0
  14. gpp_client-26.5.0.dev2/src/gpp_client/cli/commands/target.py +94 -0
  15. gpp_client-26.5.0.dev2/src/gpp_client/cli/commands/workflow_state.py +61 -0
  16. {gpp_client-26.4.1.dev1 → gpp_client-26.5.0.dev2}/src/gpp_client/cli/output.py +148 -1
  17. gpp_client-26.5.0.dev2/src/gpp_client/cli/utils.py +164 -0
  18. gpp_client-26.5.0.dev2/src/gpp_client/client.py +281 -0
  19. gpp_client-26.5.0.dev2/src/gpp_client/constants.py +21 -0
  20. gpp_client-26.5.0.dev2/src/gpp_client/domains/__init__.py +30 -0
  21. gpp_client-26.5.0.dev2/src/gpp_client/domains/atom.py +46 -0
  22. {gpp_client-26.4.1.dev1/src/gpp_client/managers → gpp_client-26.5.0.dev2/src/gpp_client/domains}/attachment.py +174 -161
  23. gpp_client-26.5.0.dev2/src/gpp_client/domains/base.py +162 -0
  24. gpp_client-26.5.0.dev2/src/gpp_client/domains/goats.py +46 -0
  25. gpp_client-26.5.0.dev2/src/gpp_client/domains/observation.py +356 -0
  26. gpp_client-26.5.0.dev2/src/gpp_client/domains/program.py +292 -0
  27. gpp_client-26.4.1.dev1/src/gpp_client/directors/scheduler/coordinators/program.py → gpp_client-26.5.0.dev2/src/gpp_client/domains/scheduler.py +72 -32
  28. {gpp_client-26.4.1.dev1/src/gpp_client/managers → gpp_client-26.5.0.dev2/src/gpp_client/domains}/site_status.py +15 -16
  29. gpp_client-26.5.0.dev2/src/gpp_client/domains/target.py +333 -0
  30. gpp_client-26.5.0.dev2/src/gpp_client/domains/workflow_state.py +290 -0
  31. gpp_client-26.5.0.dev2/src/gpp_client/environment.py +49 -0
  32. {gpp_client-26.4.1.dev1/src/gpp_client/api → gpp_client-26.5.0.dev2/src/gpp_client/generated}/__init__.py +613 -6
  33. gpp_client-26.5.0.dev2/src/gpp_client/generated/client.py +7335 -0
  34. gpp_client-26.5.0.dev2/src/gpp_client/generated/clone_observation.py +24 -0
  35. gpp_client-26.5.0.dev2/src/gpp_client/generated/clone_target.py +20 -0
  36. gpp_client-26.5.0.dev2/src/gpp_client/generated/create_call_for_proposals.py +26 -0
  37. gpp_client-26.5.0.dev2/src/gpp_client/generated/create_observation.py +22 -0
  38. gpp_client-26.5.0.dev2/src/gpp_client/generated/create_program.py +20 -0
  39. gpp_client-26.5.0.dev2/src/gpp_client/generated/create_target_by_program_id.py +20 -0
  40. gpp_client-26.5.0.dev2/src/gpp_client/generated/create_target_by_program_reference.py +24 -0
  41. gpp_client-26.5.0.dev2/src/gpp_client/generated/create_target_by_proposal_reference.py +24 -0
  42. {gpp_client-26.4.1.dev1/src/gpp_client/api → gpp_client-26.5.0.dev2/src/gpp_client/generated}/custom_fields.py +797 -10
  43. {gpp_client-26.4.1.dev1/src/gpp_client/api → gpp_client-26.5.0.dev2/src/gpp_client/generated}/custom_typing_fields.py +120 -0
  44. gpp_client-26.5.0.dev2/src/gpp_client/generated/delete_call_for_proposals_by_id.py +27 -0
  45. gpp_client-26.5.0.dev2/src/gpp_client/generated/delete_observation_by_id.py +23 -0
  46. gpp_client-26.5.0.dev2/src/gpp_client/generated/delete_observation_by_reference.py +23 -0
  47. gpp_client-26.5.0.dev2/src/gpp_client/generated/delete_program_by_id.py +69 -0
  48. gpp_client-26.5.0.dev2/src/gpp_client/generated/delete_target_by_id.py +32 -0
  49. {gpp_client-26.4.1.dev1/src/gpp_client/api → gpp_client-26.5.0.dev2/src/gpp_client/generated}/enums.py +112 -6
  50. gpp_client-26.5.0.dev2/src/gpp_client/generated/fragments.py +681 -0
  51. gpp_client-26.5.0.dev2/src/gpp_client/generated/get_call_for_proposals.py +19 -0
  52. gpp_client-26.5.0.dev2/src/gpp_client/generated/get_calls_for_proposals.py +23 -0
  53. gpp_client-26.5.0.dev2/src/gpp_client/generated/get_observation.py +15 -0
  54. gpp_client-26.5.0.dev2/src/gpp_client/generated/get_observation_attachments_by_id.py +20 -0
  55. gpp_client-26.5.0.dev2/src/gpp_client/generated/get_observation_attachments_by_reference.py +20 -0
  56. gpp_client-26.5.0.dev2/src/gpp_client/generated/get_observation_workflow_state_by_id.py +25 -0
  57. gpp_client-26.5.0.dev2/src/gpp_client/generated/get_observation_workflow_state_by_reference.py +25 -0
  58. gpp_client-26.5.0.dev2/src/gpp_client/generated/get_observations.py +21 -0
  59. gpp_client-26.5.0.dev2/src/gpp_client/generated/get_program_attachments_by_id.py +20 -0
  60. gpp_client-26.5.0.dev2/src/gpp_client/generated/get_program_attachments_by_proposal_reference.py +20 -0
  61. gpp_client-26.5.0.dev2/src/gpp_client/generated/get_program_attachments_by_reference.py +20 -0
  62. gpp_client-26.5.0.dev2/src/gpp_client/generated/get_program_by_id.py +15 -0
  63. gpp_client-26.5.0.dev2/src/gpp_client/generated/get_program_by_proposal_reference.py +15 -0
  64. gpp_client-26.5.0.dev2/src/gpp_client/generated/get_program_by_reference.py +15 -0
  65. gpp_client-26.5.0.dev2/src/gpp_client/generated/get_programs.py +21 -0
  66. gpp_client-26.5.0.dev2/src/gpp_client/generated/get_target_by_id.py +15 -0
  67. gpp_client-26.5.0.dev2/src/gpp_client/generated/get_targets.py +21 -0
  68. {gpp_client-26.4.1.dev1/src/gpp_client/api → gpp_client-26.5.0.dev2/src/gpp_client/generated}/input_types.py +153 -21
  69. gpp_client-26.5.0.dev2/src/gpp_client/generated/package_environment.py +5 -0
  70. gpp_client-26.5.0.dev2/src/gpp_client/generated/ping.py +19 -0
  71. gpp_client-26.5.0.dev2/src/gpp_client/generated/restore_call_for_proposals_by_id.py +27 -0
  72. gpp_client-26.5.0.dev2/src/gpp_client/generated/restore_observation_by_id.py +23 -0
  73. gpp_client-26.5.0.dev2/src/gpp_client/generated/restore_observation_by_reference.py +23 -0
  74. gpp_client-26.5.0.dev2/src/gpp_client/generated/restore_program_by_id.py +69 -0
  75. gpp_client-26.5.0.dev2/src/gpp_client/generated/restore_target_by_id.py +32 -0
  76. gpp_client-26.5.0.dev2/src/gpp_client/generated/set_observation_workflow_state.py +21 -0
  77. gpp_client-26.5.0.dev2/src/gpp_client/generated/update_call_for_proposals_by_id.py +27 -0
  78. gpp_client-26.5.0.dev2/src/gpp_client/generated/update_calls_for_proposals.py +27 -0
  79. gpp_client-26.5.0.dev2/src/gpp_client/generated/update_observation_by_id.py +23 -0
  80. gpp_client-26.5.0.dev2/src/gpp_client/generated/update_observation_by_reference.py +23 -0
  81. gpp_client-26.5.0.dev2/src/gpp_client/generated/update_observations.py +23 -0
  82. gpp_client-26.5.0.dev2/src/gpp_client/generated/update_program_by_id.py +21 -0
  83. gpp_client-26.5.0.dev2/src/gpp_client/generated/update_programs.py +21 -0
  84. gpp_client-26.5.0.dev2/src/gpp_client/generated/update_target_by_id.py +21 -0
  85. gpp_client-26.5.0.dev2/src/gpp_client/generated/update_targets.py +21 -0
  86. gpp_client-26.5.0.dev2/src/gpp_client/rest/__init__.py +7 -0
  87. gpp_client-26.4.1.dev1/src/gpp_client/rest.py → gpp_client-26.5.0.dev2/src/gpp_client/rest/client.py +30 -38
  88. gpp_client-26.5.0.dev2/src/gpp_client/rest/utils.py +98 -0
  89. gpp_client-26.5.0.dev2/src/gpp_client/settings.py +225 -0
  90. gpp_client-26.5.0.dev2/src/gpp_client/urls.py +57 -0
  91. gpp_client-26.4.1.dev1/PKG-INFO +0 -100
  92. gpp_client-26.4.1.dev1/setup.cfg +0 -4
  93. gpp_client-26.4.1.dev1/src/custom_plugins/__init__.py +0 -3
  94. gpp_client-26.4.1.dev1/src/custom_plugins/alias_str_wrapper.py +0 -31
  95. gpp_client-26.4.1.dev1/src/gpp_client/__init__.py +0 -10
  96. gpp_client-26.4.1.dev1/src/gpp_client/api/_client.py +0 -1636
  97. gpp_client-26.4.1.dev1/src/gpp_client/cli/__init__.py +0 -3
  98. gpp_client-26.4.1.dev1/src/gpp_client/cli/commands/attachment.py +0 -230
  99. gpp_client-26.4.1.dev1/src/gpp_client/cli/commands/call_for_proposals.py +0 -176
  100. gpp_client-26.4.1.dev1/src/gpp_client/cli/commands/config.py +0 -227
  101. gpp_client-26.4.1.dev1/src/gpp_client/cli/commands/configuration_request.py +0 -78
  102. gpp_client-26.4.1.dev1/src/gpp_client/cli/commands/goats.py +0 -53
  103. gpp_client-26.4.1.dev1/src/gpp_client/cli/commands/group.py +0 -165
  104. gpp_client-26.4.1.dev1/src/gpp_client/cli/commands/observation.py +0 -264
  105. gpp_client-26.4.1.dev1/src/gpp_client/cli/commands/program.py +0 -157
  106. gpp_client-26.4.1.dev1/src/gpp_client/cli/commands/program_note.py +0 -184
  107. gpp_client-26.4.1.dev1/src/gpp_client/cli/commands/scheduler.py +0 -28
  108. gpp_client-26.4.1.dev1/src/gpp_client/cli/commands/site_status.py +0 -28
  109. gpp_client-26.4.1.dev1/src/gpp_client/cli/commands/target.py +0 -199
  110. gpp_client-26.4.1.dev1/src/gpp_client/cli/commands/workflow_state.py +0 -54
  111. gpp_client-26.4.1.dev1/src/gpp_client/cli/utils.py +0 -96
  112. gpp_client-26.4.1.dev1/src/gpp_client/client.py +0 -265
  113. gpp_client-26.4.1.dev1/src/gpp_client/config/__init__.py +0 -5
  114. gpp_client-26.4.1.dev1/src/gpp_client/config/config.py +0 -369
  115. gpp_client-26.4.1.dev1/src/gpp_client/config/defaults.py +0 -60
  116. gpp_client-26.4.1.dev1/src/gpp_client/config/environment.py +0 -34
  117. gpp_client-26.4.1.dev1/src/gpp_client/config/models.py +0 -62
  118. gpp_client-26.4.1.dev1/src/gpp_client/coordinator/__init__.py +0 -3
  119. gpp_client-26.4.1.dev1/src/gpp_client/coordinator/base.py +0 -17
  120. gpp_client-26.4.1.dev1/src/gpp_client/credentials/__init__.py +0 -4
  121. gpp_client-26.4.1.dev1/src/gpp_client/credentials/credential_resolver.py +0 -174
  122. gpp_client-26.4.1.dev1/src/gpp_client/credentials/env_var_reader.py +0 -63
  123. gpp_client-26.4.1.dev1/src/gpp_client/director.py +0 -44
  124. gpp_client-26.4.1.dev1/src/gpp_client/directors/__init__.py +0 -4
  125. gpp_client-26.4.1.dev1/src/gpp_client/directors/base.py +0 -17
  126. gpp_client-26.4.1.dev1/src/gpp_client/directors/goats/__init__.py +0 -3
  127. gpp_client-26.4.1.dev1/src/gpp_client/directors/goats/coordinators/__init__.py +0 -4
  128. gpp_client-26.4.1.dev1/src/gpp_client/directors/goats/coordinators/observation.py +0 -43
  129. gpp_client-26.4.1.dev1/src/gpp_client/directors/goats/coordinators/program.py +0 -23
  130. gpp_client-26.4.1.dev1/src/gpp_client/directors/goats/goats.py +0 -35
  131. gpp_client-26.4.1.dev1/src/gpp_client/directors/scheduler/__init__.py +0 -3
  132. gpp_client-26.4.1.dev1/src/gpp_client/directors/scheduler/coordinators/__init__.py +0 -4
  133. gpp_client-26.4.1.dev1/src/gpp_client/directors/scheduler/coordinators/observation.py +0 -16
  134. gpp_client-26.4.1.dev1/src/gpp_client/directors/scheduler/coordinators/target.py +0 -14
  135. gpp_client-26.4.1.dev1/src/gpp_client/directors/scheduler/scheduler.py +0 -31
  136. gpp_client-26.4.1.dev1/src/gpp_client/managers/__init__.py +0 -23
  137. gpp_client-26.4.1.dev1/src/gpp_client/managers/atom.py +0 -83
  138. gpp_client-26.4.1.dev1/src/gpp_client/managers/base.py +0 -447
  139. gpp_client-26.4.1.dev1/src/gpp_client/managers/call_for_proposals.py +0 -375
  140. gpp_client-26.4.1.dev1/src/gpp_client/managers/configuration_request.py +0 -199
  141. gpp_client-26.4.1.dev1/src/gpp_client/managers/group.py +0 -383
  142. gpp_client-26.4.1.dev1/src/gpp_client/managers/observation.py +0 -764
  143. gpp_client-26.4.1.dev1/src/gpp_client/managers/program.py +0 -417
  144. gpp_client-26.4.1.dev1/src/gpp_client/managers/program_note.py +0 -398
  145. gpp_client-26.4.1.dev1/src/gpp_client/managers/target.py +0 -486
  146. gpp_client-26.4.1.dev1/src/gpp_client/managers/workflow_state.py +0 -342
  147. gpp_client-26.4.1.dev1/src/gpp_client/subscribers/__init__.py +0 -5
  148. gpp_client-26.4.1.dev1/src/gpp_client/subscribers/observation.py +0 -45
  149. gpp_client-26.4.1.dev1/src/gpp_client/subscribers/program.py +0 -28
  150. gpp_client-26.4.1.dev1/src/gpp_client/subscribers/target.py +0 -29
  151. gpp_client-26.4.1.dev1/src/gpp_client.egg-info/SOURCES.txt +0 -96
  152. gpp_client-26.4.1.dev1/src/gpp_client.egg-info/dependency_links.txt +0 -1
  153. gpp_client-26.4.1.dev1/src/gpp_client.egg-info/entry_points.txt +0 -2
  154. gpp_client-26.4.1.dev1/src/gpp_client.egg-info/requires.txt +0 -8
  155. gpp_client-26.4.1.dev1/src/gpp_client.egg-info/top_level.txt +0 -3
  156. {gpp_client-26.4.1.dev1 → gpp_client-26.5.0.dev2}/LICENSE +0 -0
  157. {gpp_client-26.4.1.dev1 → gpp_client-26.5.0.dev2}/README.md +0 -0
  158. {gpp_client-26.4.1.dev1/src/gpp_client/cli/commands → gpp_client-26.5.0.dev2/src/gpp_client/cli}/__init__.py +0 -0
  159. {gpp_client-26.4.1.dev1 → gpp_client-26.5.0.dev2}/src/gpp_client/cli/console.py +0 -0
  160. {gpp_client-26.4.1.dev1 → gpp_client-26.5.0.dev2}/src/gpp_client/exceptions.py +0 -0
  161. {gpp_client-26.4.1.dev1/src/gpp_client/api → gpp_client-26.5.0.dev2/src/gpp_client/generated}/async_base_client.py +0 -0
  162. {gpp_client-26.4.1.dev1/src/gpp_client/api → gpp_client-26.5.0.dev2/src/gpp_client/generated}/base_model.py +0 -0
  163. {gpp_client-26.4.1.dev1/src/gpp_client/api → gpp_client-26.5.0.dev2/src/gpp_client/generated}/base_operation.py +0 -0
  164. {gpp_client-26.4.1.dev1/src/gpp_client/api → gpp_client-26.5.0.dev2/src/gpp_client/generated}/custom_mutations.py +0 -0
  165. {gpp_client-26.4.1.dev1/src/gpp_client/api → gpp_client-26.5.0.dev2/src/gpp_client/generated}/custom_queries.py +0 -0
  166. {gpp_client-26.4.1.dev1/src/gpp_client/api → gpp_client-26.5.0.dev2/src/gpp_client/generated}/exceptions.py +0 -0
  167. {gpp_client-26.4.1.dev1/src/gpp_client/api → gpp_client-26.5.0.dev2/src/gpp_client/generated}/get_goats_observations.py +0 -0
  168. {gpp_client-26.4.1.dev1/src/gpp_client/api → gpp_client-26.5.0.dev2/src/gpp_client/generated}/get_goats_programs.py +0 -0
  169. {gpp_client-26.4.1.dev1/src/gpp_client/api → gpp_client-26.5.0.dev2/src/gpp_client/generated}/get_scheduler_all_programs_id.py +0 -0
  170. {gpp_client-26.4.1.dev1/src/gpp_client/api → gpp_client-26.5.0.dev2/src/gpp_client/generated}/get_scheduler_programs.py +0 -0
  171. {gpp_client-26.4.1.dev1/src/gpp_client/api → gpp_client-26.5.0.dev2/src/gpp_client/generated}/obs_calculation_update.py +0 -0
  172. {gpp_client-26.4.1.dev1/src/gpp_client/api → gpp_client-26.5.0.dev2/src/gpp_client/generated}/observation_edit.py +0 -0
  173. {gpp_client-26.4.1.dev1/src/gpp_client/api → gpp_client-26.5.0.dev2/src/gpp_client/generated}/program_edit.py +0 -0
  174. {gpp_client-26.4.1.dev1/src/gpp_client/api → gpp_client-26.5.0.dev2/src/gpp_client/generated}/target_edit.py +0 -0
  175. {gpp_client-26.4.1.dev1 → gpp_client-26.5.0.dev2}/src/gpp_client/logging_utils.py +0 -0
@@ -0,0 +1,178 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py,cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+ cover/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+ # Flask stuff:
65
+ instance/
66
+ .webassets-cache
67
+
68
+ # Scrapy stuff:
69
+ .scrapy
70
+
71
+ # Sphinx documentation
72
+ docs/_build/
73
+
74
+ # PyBuilder
75
+ .pybuilder/
76
+
77
+ # Jupyter Notebook
78
+ .ipynb_checkpoints
79
+
80
+ # IPython
81
+ profile_default/
82
+ ipython_config.py
83
+
84
+ # pyenv
85
+ # For a library or package, you might want to ignore these files since the code is
86
+ # intended to run in multiple environments; otherwise, check them in:
87
+ # .python-version
88
+
89
+ # pipenv
90
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
91
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
92
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
93
+ # install all needed dependencies.
94
+ #Pipfile.lock
95
+
96
+ # UV
97
+ # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
98
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
99
+ # commonly ignored for libraries.
100
+ #uv.lock
101
+
102
+ # poetry
103
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
104
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
105
+ # commonly ignored for libraries.
106
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
107
+ #poetry.lock
108
+
109
+ # pdm
110
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
111
+ #pdm.lock
112
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
113
+ # in version control.
114
+ # https://pdm.fming.dev/latest/usage/project/#working-with-version-control
115
+ .pdm.toml
116
+ .pdm-python
117
+ .pdm-build/
118
+
119
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
120
+ __pypackages__/
121
+
122
+ # Celery stuff
123
+ celerybeat-schedule
124
+ celerybeat.pid
125
+
126
+ # SageMath parsed files
127
+ *.sage.py
128
+
129
+ # Environments
130
+ .env
131
+ .venv
132
+ env/
133
+ venv/
134
+ ENV/
135
+ env.bak/
136
+ venv.bak/
137
+
138
+ # Spyder project settings
139
+ .spyderproject
140
+ .spyproject
141
+
142
+ # Rope project settings
143
+ .ropeproject
144
+
145
+ # mkdocs documentation
146
+ /site
147
+
148
+ # mypy
149
+ .mypy_cache/
150
+ .dmypy.json
151
+ dmypy.json
152
+
153
+ # Pyre type checker
154
+ .pyre/
155
+
156
+ # pytype static type analyzer
157
+ .pytype/
158
+
159
+ # Cython debug symbols
160
+ cython_debug/
161
+
162
+ # PyCharm
163
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
164
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
165
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
166
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
167
+ #.idea/
168
+
169
+ # Ruff stuff:
170
+ .ruff_cache/
171
+
172
+ # PyPI configuration file
173
+ .pypirc
174
+
175
+ # macOS files
176
+ *.DS_Store
177
+
178
+ .vscode
@@ -1,7 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gpp-client
3
- Version: 26.4.1.dev1
3
+ Version: 26.5.0.dev2
4
4
  Summary: Gemini Program Platform client.
5
+ Project-URL: Homepage, https://github.com/gemini-hlsw/gpp-client
6
+ Project-URL: Source, https://github.com/gemini-hlsw/gpp-client
7
+ Project-URL: Issues, https://github.com/gemini-hlsw/gpp-client/issues
8
+ Project-URL: Documentation, https://gpp-client.readthedocs.io/en/latest/
5
9
  Author: NOIRLab
6
10
  License: Copyright (c) 2025 Association of Universities for Research in Astronomy, Inc. (AURA)
7
11
  All rights reserved.
@@ -28,34 +32,27 @@ License: Copyright (c) 2025 Association of Universities for Research in Astronom
28
32
  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29
33
  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
30
34
  THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
-
32
- Project-URL: Homepage, https://github.com/gemini-hlsw/gpp-client
33
- Project-URL: Source, https://github.com/gemini-hlsw/gpp-client
34
- Project-URL: Issues, https://github.com/gemini-hlsw/gpp-client/issues
35
- Project-URL: Documentation, https://gpp-client.readthedocs.io/en/latest/
36
- Keywords: gemini,gpp,client,program,platform
35
+ License-File: LICENSE
36
+ Keywords: client,gemini,gpp,platform,program
37
37
  Classifier: Development Status :: 3 - Alpha
38
38
  Classifier: Intended Audience :: Science/Research
39
39
  Classifier: Operating System :: OS Independent
40
40
  Classifier: Programming Language :: Python :: 3
41
- Classifier: Programming Language :: Python :: 3.10
42
41
  Classifier: Programming Language :: Python :: 3.11
43
42
  Classifier: Programming Language :: Python :: 3.12
44
43
  Classifier: Programming Language :: Python :: 3.13
45
44
  Classifier: Programming Language :: Python :: 3.14
46
45
  Classifier: Topic :: Scientific/Engineering :: Astronomy
47
- Requires-Python: >=3.10.0
48
- Description-Content-Type: text/markdown
49
- License-File: LICENSE
50
- Requires-Dist: aiohttp>=3.13.3
46
+ Requires-Python: >=3.11.0
47
+ Requires-Dist: aiohttp>=3.13.4
51
48
  Requires-Dist: beautifulsoup4>=4.11.0
52
49
  Requires-Dist: graphql-core>=3.2.0
53
50
  Requires-Dist: httpx>=0.23
51
+ Requires-Dist: pydantic-settings>=2.13.1
54
52
  Requires-Dist: pydantic>=2.12.0
55
- Requires-Dist: toml>=0.10
56
53
  Requires-Dist: typer>=0.21.1
57
54
  Requires-Dist: websockets>=14.2
58
- Dynamic: license-file
55
+ Description-Content-Type: text/markdown
59
56
 
60
57
  # GPP Client
61
58
 
@@ -0,0 +1,39 @@
1
+ ## GraphQL Operations Structure
2
+
3
+ GraphQL operations are now organized to support both shared and environment-specific behavior.
4
+
5
+ ### Directory Layout
6
+
7
+ - `graphql/operations/shared/`
8
+ - Contains all operations and fragments used in both development and production.
9
+ - `graphql/operations/development_only.graphql`
10
+ - Contains operations and fragments that exist only in the development schema.
11
+
12
+ ### How It Works
13
+
14
+ - **Production**
15
+ - Uses only the contents of `shared/`.
16
+
17
+ - **Development**
18
+ - Uses `shared/` + `development_only.graphql`.
19
+
20
+ - During code generation, these are assembled into a temporary build directory and passed to `ariadne-codegen`.
21
+
22
+ ### Rules
23
+
24
+ - `development_only.graphql` must be **additive only**.
25
+ - No operation or fragment names may collide with anything in `shared/`.
26
+ - Violations will fail code generation.
27
+
28
+ - If `development_only.graphql` is empty or missing, it is ignored.
29
+
30
+ ### Guidelines
31
+
32
+ - Put anything stable and supported in both environments into `shared/`.
33
+ - Put experimental, dev-only, or not-yet-released schema usage into `development_only.graphql`.
34
+ - Once a dev-only operation is promoted to production, move it into `shared/` and remove it from `development_only.graphql`.
35
+
36
+ ### Notes
37
+
38
+ - The `build/` directory is temporary and is recreated on each codegen run.
39
+ - Generated client code reflects the environment used during codegen.
@@ -1,6 +1,6 @@
1
1
  [build-system]
2
- requires = ["setuptools"]
3
- build-backend = "setuptools.build_meta"
2
+ requires = ["hatchling", "uv-dynamic-versioning"]
3
+ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "gpp-client"
@@ -8,13 +8,12 @@ description = "Gemini Program Platform client."
8
8
  readme = "README.md"
9
9
  authors = [{ name = "NOIRLab" }]
10
10
  license = { file = "LICENSE" }
11
- requires-python = ">=3.10.0"
11
+ requires-python = ">=3.11.0"
12
12
  classifiers = [
13
13
  "Development Status :: 3 - Alpha",
14
14
  "Intended Audience :: Science/Research",
15
15
  "Operating System :: OS Independent",
16
16
  "Programming Language :: Python :: 3",
17
- "Programming Language :: Python :: 3.10",
18
17
  "Programming Language :: Python :: 3.11",
19
18
  "Programming Language :: Python :: 3.12",
20
19
  "Programming Language :: Python :: 3.13",
@@ -22,20 +21,41 @@ classifiers = [
22
21
  "Topic :: Scientific/Engineering :: Astronomy",
23
22
  ]
24
23
  dependencies = [
25
- "aiohttp>=3.13.3",
24
+ "aiohttp>=3.13.4",
26
25
  "beautifulsoup4>=4.11.0",
27
26
  "graphql-core>=3.2.0",
28
27
  "httpx>=0.23",
29
28
  "pydantic>=2.12.0",
30
- "toml>=0.10",
29
+ "pydantic-settings>=2.13.1",
31
30
  "typer>=0.21.1",
32
31
  "websockets>=14.2",
33
32
  ]
34
- version = "26.4.1.dev1"
33
+ dynamic = ["version"]
35
34
  keywords = ["gemini", "gpp", "client", "program", "platform"]
36
35
 
37
- [tool.setuptools.packages.find]
38
- where = ["src"]
36
+ [tool.hatch.version]
37
+ source = "uv-dynamic-versioning"
38
+
39
+ [tool.uv-dynamic-versioning]
40
+ style = "pep440"
41
+ pattern = '^v(?P<base>\d{2}\.\d{1,2}\.\d+)(?:\.(?P<stage>dev)(?P<revision>\d+))?$'
42
+ strict = true
43
+ metadata = false
44
+ fallback-version = "0.0.0"
45
+
46
+ [tool.uv]
47
+ cache-keys = [{ file = "pyproject.toml" }, { git = { commit = true, tags = true }}]
48
+
49
+ [tool.hatch.build.targets.wheel]
50
+ packages = ["src/gpp_client"]
51
+
52
+ [tool.hatch.build.targets.sdist]
53
+ include = [
54
+ "src/gpp_client",
55
+ "README.md",
56
+ "LICENSE",
57
+ "pyproject.toml",
58
+ ]
39
59
 
40
60
  [project.scripts]
41
61
  gpp = "gpp_client.cli.cli:main"
@@ -50,23 +70,13 @@ docstring-code-line-length = "dynamic"
50
70
 
51
71
  [tool.ruff]
52
72
  # Ignore generated code.
53
- extend-exclude = ["api"]
73
+ extend-exclude = ["generated"]
54
74
 
55
75
  [tool.pytest.ini_options]
56
76
  testpaths = ["tests"]
57
77
  addopts = "-r A -v -n auto"
58
78
  asyncio_default_fixture_loop_scope = "session"
59
79
 
60
- [tool.ariadne-codegen]
61
- client_name = "_GPPClient"
62
- client_file_name = "_client"
63
- enable_custom_operations = true
64
- target_package_name = "api"
65
- target_package_path = "src/gpp_client"
66
- convert_to_snake_case = true
67
- plugins = ["custom_plugins.AliasStrWrapperPlugin"]
68
- queries_path = "src/queries"
69
-
70
80
  [tool.numpydoc_validation]
71
81
  checks = [
72
82
  "all", # All except the rules listed below.
@@ -89,13 +99,13 @@ codegen = [
89
99
  dev = [
90
100
  { include-group = "codegen" },
91
101
  "polyfactory>=3.2.0",
92
- "pytest>=9.0.1",
102
+ "pytest>=9.0.3",
93
103
  "pytest-asyncio>=1.3.0",
94
- "pytest-cov>=7.0.0",
104
+ "pytest-cov>=7.1.0",
95
105
  "pytest-mock>=3.15.1",
96
106
  "pytest-remotedata>=0.4.1",
97
107
  "pytest-xdist>=3.8.0",
98
- "ruff>=0.15.0",
108
+ "ruff>=0.15.12",
99
109
  ]
100
110
  docs = [
101
111
  "furo==2025.12.19",
@@ -104,10 +114,7 @@ docs = [
104
114
  "sphinx-copybutton>=0.5.2",
105
115
  "sphinxcontrib-typer>=0.7.2",
106
116
  ]
107
- schema = [
108
- "aiohttp>=3.13.3",
109
- "gql>=3.5.0,<4.0.0",
110
- ]
117
+ schema = [{ include-group = "codegen" }]
111
118
 
112
119
  [project.urls]
113
120
  Homepage = "https://github.com/gemini-hlsw/gpp-client"
@@ -0,0 +1,47 @@
1
+ """
2
+ Top-level package for gpp_client.
3
+ """
4
+
5
+ import importlib.metadata
6
+ from typing import TYPE_CHECKING, Any
7
+
8
+ if TYPE_CHECKING:
9
+ from .client import GPPClient
10
+
11
+ __all__ = ["GPPClient", "__version__"]
12
+
13
+ _FALLBACK_VERSION = "0.0.0"
14
+
15
+
16
+ try:
17
+ __version__ = importlib.metadata.version(__name__)
18
+ except importlib.metadata.PackageNotFoundError:
19
+ # Have fallback version for development environments.
20
+ __version__ = _FALLBACK_VERSION
21
+
22
+
23
+ def __getattr__(name: str) -> Any:
24
+ """
25
+ Lazily import top-level package attributes.
26
+
27
+ Parameters
28
+ ----------
29
+ name : str
30
+ The attribute name being accessed.
31
+
32
+ Returns
33
+ -------
34
+ Any
35
+ The resolved attribute.
36
+
37
+ Raises
38
+ ------
39
+ AttributeError
40
+ If the attribute is not supported.
41
+ """
42
+ if name == "GPPClient":
43
+ from .client import GPPClient
44
+
45
+ return GPPClient
46
+
47
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
@@ -4,35 +4,33 @@ CLI entry point for GPP Client.
4
4
 
5
5
  __all__ = ["app"]
6
6
 
7
- from importlib.metadata import version as get_version
8
- from typing import Annotated
9
7
  from dataclasses import dataclass
8
+ from typing import Annotated
9
+
10
10
  import typer
11
11
 
12
+ from gpp_client import GPPClient, __version__
12
13
  from gpp_client.cli import output
13
14
  from gpp_client.cli.commands import (
14
- attachment,
15
- call_for_proposals,
16
- config,
17
- configuration_request,
18
- goats,
19
- group,
20
- observation,
21
- program,
22
- program_note,
23
- scheduler,
24
- site_status,
25
- target,
26
- workflow_state,
15
+ attachment_app,
16
+ goats_app,
17
+ observation_app,
18
+ program_app,
19
+ scheduler_app,
20
+ site_status_app,
21
+ target_app,
22
+ workflow_state_app,
27
23
  )
28
24
  from gpp_client.cli.utils import async_command
29
- from gpp_client.client import GPPClient
30
-
31
- __version__ = get_version("gpp-client").strip()
25
+ from gpp_client.settings import get_config_path as _get_config_path
32
26
 
33
27
 
34
28
  @dataclass(slots=True)
35
29
  class CLIState:
30
+ """
31
+ Shared CLI state.
32
+ """
33
+
36
34
  debug: bool = False
37
35
 
38
36
 
@@ -41,9 +39,17 @@ app = typer.Typer(
41
39
  )
42
40
 
43
41
 
44
- def version_callback(value: bool):
42
+ def version_callback(value: bool) -> None:
43
+ """
44
+ Callback to print version and exit.
45
+
46
+ Parameters
47
+ ----------
48
+ value : bool
49
+ Whether to print the version and exit.
50
+ """
45
51
  if value:
46
- print(f"{__version__}")
52
+ output.info(f"{__version__}")
47
53
  raise typer.Exit()
48
54
 
49
55
 
@@ -69,22 +75,6 @@ def main_callback(
69
75
  ):
70
76
  """Main entry point callback for GPP Client CLI."""
71
77
  ctx.obj = CLIState(debug=debug)
72
- pass
73
-
74
-
75
- app.add_typer(config.app)
76
- app.add_typer(program_note.app)
77
- app.add_typer(target.app)
78
- app.add_typer(program.app)
79
- app.add_typer(call_for_proposals.app)
80
- app.add_typer(observation.app)
81
- app.add_typer(site_status.app)
82
- app.add_typer(group.app)
83
- app.add_typer(configuration_request.app)
84
- app.add_typer(workflow_state.app)
85
- app.add_typer(scheduler.app)
86
- app.add_typer(goats.app)
87
- app.add_typer(attachment.app)
88
78
 
89
79
 
90
80
  @app.command("ping")
@@ -92,7 +82,7 @@ app.add_typer(attachment.app)
92
82
  async def ping() -> None:
93
83
  """Ping GPP. Requires valid credentials."""
94
84
  client = GPPClient()
95
- success, error = await client.is_reachable()
85
+ success, error = await client.ping()
96
86
  if not success:
97
87
  output.fail(f"Failed to reach GPP: {error}")
98
88
  raise typer.Exit(code=1)
@@ -100,6 +90,24 @@ async def ping() -> None:
100
90
  output.success("GPP is reachable. Credentials are valid.")
101
91
 
102
92
 
93
+ @app.command("get-config-path")
94
+ def get_config_path() -> None:
95
+ """Get the path to the GPP Client configuration file."""
96
+
97
+ config_path = _get_config_path()
98
+ output.info(f"{config_path.resolve()}")
99
+
100
+
101
+ app.add_typer(observation_app)
102
+ app.add_typer(program_app)
103
+ app.add_typer(attachment_app)
104
+ app.add_typer(target_app)
105
+ app.add_typer(workflow_state_app)
106
+ app.add_typer(site_status_app)
107
+ app.add_typer(goats_app)
108
+ app.add_typer(scheduler_app)
109
+
110
+
103
111
  def main() -> None:
104
112
  """Main entry point for GPP Client CLI."""
105
113
  app()
@@ -0,0 +1,23 @@
1
+ """
2
+ Commands for the GPP CLI.
3
+ """
4
+
5
+ from .attachment import attachment_app
6
+ from .goats import goats_app
7
+ from .observation import observation_app
8
+ from .program import program_app
9
+ from .scheduler import scheduler_app
10
+ from .site_status import site_status_app
11
+ from .target import target_app
12
+ from .workflow_state import workflow_state_app
13
+
14
+ __all__ = [
15
+ "observation_app",
16
+ "program_app",
17
+ "attachment_app",
18
+ "target_app",
19
+ "workflow_state_app",
20
+ "site_status_app",
21
+ "goats_app",
22
+ "scheduler_app",
23
+ ]
@@ -0,0 +1,97 @@
1
+ """
2
+ Attachment CLI commands.
3
+ """
4
+
5
+ __all__ = ["attachment_app"]
6
+
7
+ from typing import Annotated
8
+
9
+ import typer
10
+
11
+ from gpp_client.cli import output
12
+ from gpp_client.cli.utils import async_command, require_exactly_one
13
+ from gpp_client.client import GPPClient
14
+
15
+ attachment_app = typer.Typer(
16
+ name="attachment",
17
+ help="Attachment operations.",
18
+ )
19
+
20
+
21
+ @attachment_app.command("list")
22
+ @async_command
23
+ async def list_attachments(
24
+ observation_id: Annotated[
25
+ str | None,
26
+ typer.Option(
27
+ "--observation-id",
28
+ help="List attachments by observation ID.",
29
+ ),
30
+ ] = None,
31
+ observation_reference: Annotated[
32
+ str | None,
33
+ typer.Option(
34
+ "--observation-reference",
35
+ help="List attachments by observation reference.",
36
+ ),
37
+ ] = None,
38
+ program_id: Annotated[
39
+ str | None,
40
+ typer.Option(
41
+ "--program-id",
42
+ help="List attachments by program ID.",
43
+ ),
44
+ ] = None,
45
+ program_reference: Annotated[
46
+ str | None,
47
+ typer.Option(
48
+ "--program-reference",
49
+ help="List attachments by program reference.",
50
+ ),
51
+ ] = None,
52
+ proposal_reference: Annotated[
53
+ str | None,
54
+ typer.Option(
55
+ "--proposal-reference",
56
+ help="List attachments by proposal reference.",
57
+ ),
58
+ ] = None,
59
+ ) -> None:
60
+ """
61
+ List attachments using exactly one selector.
62
+ """
63
+ selector_name, selector_value = require_exactly_one(
64
+ observation_id=observation_id,
65
+ observation_reference=observation_reference,
66
+ program_id=program_id,
67
+ program_reference=program_reference,
68
+ proposal_reference=proposal_reference,
69
+ )
70
+
71
+ with output.status("Fetching attachments..."):
72
+ async with GPPClient() as client:
73
+ match selector_name:
74
+ case "observation_id":
75
+ result = await client.attachment.get_all_by_observation_id(
76
+ observation_id=selector_value
77
+ )
78
+ case "observation_reference":
79
+ result = await client.attachment.get_all_by_observation_reference(
80
+ observation_reference=selector_value
81
+ )
82
+ case "program_id":
83
+ result = await client.attachment.get_all_by_program_id(
84
+ program_id=selector_value
85
+ )
86
+ case "program_reference":
87
+ result = await client.attachment.get_all_by_program_reference(
88
+ program_reference=selector_value
89
+ )
90
+ case "proposal_reference":
91
+ result = await client.attachment.get_all_by_proposal_reference(
92
+ proposal_reference=selector_value
93
+ )
94
+ case _:
95
+ raise typer.BadParameter(f"Unsupported selector: {selector_name}")
96
+
97
+ output.json_pydantic(result)