qctrl-workflow-client 7.1.0__tar.gz → 7.2.0__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.
@@ -1,14 +1,14 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: qctrl-workflow-client
3
- Version: 7.1.0
3
+ Version: 7.2.0
4
4
  Summary: Q-CTRL Workflow Client
5
5
  License: https://q-ctrl.com/terms
6
- Keywords: black opal,boulder opal,fire opal,nisq,open controls,q control,q ctrl,q-control,q-ctrl,qcontrol,qctrl,quantum,quantum algorithms,quantum circuits,quantum coding,quantum coding software,quantum computing,quantum control,quantum control software,quantum control theory,quantum engineering,quantum error correction,quantum firmware,quantum fundamentals,quantum sensing,qubit,qudit
6
+ Keywords: black opal,boulder opal,fire opal,ironstone opal,nisq,open controls,q control,q ctrl,q-control,q-ctrl,qcontrol,qctrl,quantum,quantum algorithms,quantum circuits,quantum coding,quantum coding software,quantum computing,quantum control,quantum control software,quantum control theory,quantum engineering,quantum error correction,quantum firmware,quantum fundamentals,quantum navigation,quantum sensing,qubit,qudit
7
7
  Author: Q-CTRL
8
8
  Author-email: support@q-ctrl.com
9
9
  Maintainer: Q-CTRL
10
10
  Maintainer-email: support@q-ctrl.com
11
- Requires-Python: >=3.9,<3.14
11
+ Requires-Python: >=3.9, <3.14
12
12
  Classifier: Development Status :: 5 - Production/Stable
13
13
  Classifier: Environment :: Console
14
14
  Classifier: Intended Audience :: Developers
@@ -28,11 +28,11 @@ Classifier: Topic :: Scientific/Engineering :: Physics
28
28
  Classifier: Topic :: Scientific/Engineering :: Visualization
29
29
  Classifier: Topic :: Software Development :: Embedded Systems
30
30
  Classifier: Topic :: System :: Distributed Computing
31
- Requires-Dist: gql (>=3.4.0,<4.0.0)
31
+ Requires-Dist: gql (>=3.5.3,<4.0.0)
32
32
  Requires-Dist: importlib-metadata (>=8.7.0,<9.0.0)
33
33
  Requires-Dist: packaging (>=25.0,<26.0)
34
- Requires-Dist: qctrl-client (>=13.1.0,<14.0.0)
35
- Requires-Dist: qctrl-commons (>=25.1.0,<26.0.0)
34
+ Requires-Dist: qctrl-client (>=14.0.0,<15.0.0)
35
+ Requires-Dist: qctrl-commons (>=25.1.2,<26.0.0)
36
36
  Requires-Dist: requests (>=2.32.4,<3.0.0)
37
37
  Requires-Dist: tenacity (>=9.1.2,<10.0.0)
38
38
  Requires-Dist: tomli (>=2.2.1,<3.0.0)
@@ -41,6 +41,7 @@ Project-URL: Facebook, https://www.facebook.com/qctrl
41
41
  Project-URL: GitHub, https://github.com/qctrl
42
42
  Project-URL: Homepage, https://q-ctrl.com
43
43
  Project-URL: LinkedIn, https://www.linkedin.com/company/q-ctrl/
44
+ Project-URL: Source, https://github.com/qctrl/python-workflow-client
44
45
  Project-URL: X, https://x.com/qctrlHQ
45
46
  Project-URL: YouTube, https://www.youtube.com/qctrl
46
47
  Description-Content-Type: text/markdown
@@ -1,10 +1,15 @@
1
- [tool.poetry]
1
+ [project]
2
2
  name = "qctrl-workflow-client"
3
- version = "7.1.0"
4
3
  description = "Q-CTRL Workflow Client"
4
+ requires-python = ">=3.9, <3.14"
5
+ version = "7.2.0"
5
6
  license = "https://q-ctrl.com/terms"
6
- authors = ["Q-CTRL <support@q-ctrl.com>"]
7
- maintainers = ["Q-CTRL <support@q-ctrl.com>"]
7
+ authors = [
8
+ { name = "Q-CTRL", email = "support@q-ctrl.com" },
9
+ ]
10
+ maintainers = [
11
+ { name = "Q-CTRL", email = "support@q-ctrl.com" },
12
+ ]
8
13
  readme = "README.md"
9
14
  homepage = "https://q-ctrl.com"
10
15
  documentation = "https://docs.q-ctrl.com"
@@ -12,6 +17,7 @@ keywords = [
12
17
  "black opal",
13
18
  "boulder opal",
14
19
  "fire opal",
20
+ "ironstone opal",
15
21
  "nisq",
16
22
  "open controls",
17
23
  "q control",
@@ -33,37 +39,47 @@ keywords = [
33
39
  "quantum error correction",
34
40
  "quantum firmware",
35
41
  "quantum fundamentals",
42
+ "quantum navigation",
36
43
  "quantum sensing",
37
44
  "qubit",
38
45
  "qudit",
39
46
  ]
40
- classifiers = [
41
- "Development Status :: 5 - Production/Stable",
42
- "Environment :: Console",
43
- "Intended Audience :: Developers",
44
- "Intended Audience :: Education",
45
- "Intended Audience :: Science/Research",
46
- "Natural Language :: English",
47
- "Operating System :: OS Independent",
48
- "Programming Language :: Python :: 3.9",
49
- "Programming Language :: Python :: 3.10",
50
- "Programming Language :: Python :: 3.11",
51
- "Programming Language :: Python :: 3.12",
52
- "Topic :: Internet :: WWW/HTTP",
53
- "Topic :: Scientific/Engineering :: Physics",
54
- "Topic :: Scientific/Engineering :: Visualization",
55
- "Topic :: Software Development :: Embedded Systems",
56
- "Topic :: System :: Distributed Computing",
57
- ]
58
- packages = [{ include = "qctrlworkflowclient" }]
59
47
 
60
- [tool.poetry.urls]
48
+ dynamic = ["classifiers", "dependencies"]
49
+
50
+ [project.urls]
51
+ Source = "https://github.com/qctrl/python-workflow-client"
52
+ Homepage = "https://q-ctrl.com"
53
+ Documentation = "https://docs.q-ctrl.com"
61
54
  LinkedIn = "https://www.linkedin.com/company/q-ctrl/"
62
55
  Facebook = "https://www.facebook.com/qctrl"
63
56
  X = "https://x.com/qctrlHQ"
64
57
  YouTube = "https://www.youtube.com/qctrl"
65
58
  GitHub = "https://github.com/qctrl"
66
59
 
60
+ [build-system]
61
+ requires = ["poetry-core"]
62
+ build-backend = "poetry.core.masonry.api"
63
+
64
+ [tool.poetry]
65
+ classifiers = [
66
+ "Development Status :: 5 - Production/Stable",
67
+ "Environment :: Console",
68
+ "Intended Audience :: Developers",
69
+ "Intended Audience :: Education",
70
+ "Intended Audience :: Science/Research",
71
+ "Natural Language :: English",
72
+ "Operating System :: OS Independent",
73
+ "Topic :: Internet :: WWW/HTTP",
74
+ "Topic :: Scientific/Engineering :: Physics",
75
+ "Topic :: Scientific/Engineering :: Visualization",
76
+ "Topic :: Software Development :: Embedded Systems",
77
+ "Topic :: System :: Distributed Computing"
78
+ ]
79
+
80
+ packages = [{ include = "qctrlworkflowclient" }]
81
+
82
+
67
83
  [[tool.poetry.source]]
68
84
  name = "PyPI"
69
85
  priority = "primary"
@@ -74,15 +90,14 @@ url = 'https://qctrl.jfrog.io/artifactory/api/pypi/qctrl/simple/'
74
90
  priority = "supplemental"
75
91
 
76
92
  [tool.poetry.dependencies]
77
- python = ">=3.9, <3.14"
78
93
  tomli = "^2.2.1"
79
94
  importlib-metadata = "^8.7.0"
80
- gql = "^3.4.0"
95
+ gql = "^3.5.3"
81
96
  tenacity = "^9.1.2"
82
97
  requests = "^2.32.4"
83
98
  packaging = "^25.0"
84
- qctrl-commons = { version = "^25.1.0", source = "PyPI" }
85
- qctrl-client = { version = "^13.1.0", source = "PyPI" }
99
+ qctrl-commons = { version = "^25.1.2", source = "PyPI" }
100
+ qctrl-client = { version = "^14.0.0", source = "PyPI" }
86
101
 
87
102
  [tool.poetry.group.dev.dependencies]
88
103
  black = "^25.1.0"
@@ -90,10 +105,10 @@ isort = "^6.0.0"
90
105
  pre-commit = "^4.1.0"
91
106
  pylint = "^3.3.4"
92
107
  pytest = "^8.3.4"
93
- pytest-cov = "^6.0.0"
108
+ pytest-cov = "^7.0.0"
94
109
  pytest-mock = "^3.10.0"
95
110
  pytest-xdist = "^3.2.1"
96
- qctrl-core-workflow-manager = "^5.1.0"
111
+ qctrl-core-workflow-manager = "^5.1.1"
97
112
 
98
113
  [tool.isort]
99
114
  profile = "black"
@@ -101,7 +116,3 @@ force_grid_wrap = "2"
101
116
 
102
117
  [tool.pytest.ini_options]
103
118
  addopts = "--cov=qctrlworkflowclient --cov-fail-under=80 --cov-report=term-missing:skip-covered"
104
-
105
- [build-system]
106
- requires = ["poetry-core"]
107
- build-backend = "poetry.core.masonry.api"
@@ -11,7 +11,7 @@
11
11
  # distributed under the License is distributed on an "AS IS" BASIS. See the
12
12
  # License for the specific language.
13
13
 
14
- __version__ = "7.1.0"
14
+ __version__ = "7.2.0"
15
15
 
16
16
  from .defaults import get_authenticated_client_for_product
17
17
  from .functions import (
@@ -39,6 +39,7 @@ from tenacity import (
39
39
  wait_chain,
40
40
  wait_fixed,
41
41
  )
42
+ from typing_extensions import TypedDict
42
43
 
43
44
  from qctrlworkflowclient.products import Product
44
45
  from qctrlworkflowclient.settings import CoreClientSettings
@@ -173,6 +174,22 @@ class Action:
173
174
  return self.status == ActionStatus.REVOKED.value
174
175
 
175
176
 
177
+ class PresignedUrlData(TypedDict):
178
+ """
179
+ The data returned by a presigned URL mutation.
180
+
181
+ Attributes
182
+ ----------
183
+ id : str
184
+ The storage ID associated with the presigned URL.
185
+ url : str
186
+ The presigned URL for uploading data.
187
+ """
188
+
189
+ id: str
190
+ url: str
191
+
192
+
176
193
  class ApiRouter(BaseRouter):
177
194
  """
178
195
  Remotely execute the workflow using the `startCoreWorkflow`
@@ -838,6 +855,53 @@ class ApiRouter(BaseRouter):
838
855
  )
839
856
  return response["actions"]["actions"]
840
857
 
858
+ def create_presigned_url_upload(self, checksum: str) -> PresignedUrlData:
859
+ """
860
+ Create a presigned URL for uploading data using the provided checksum.
861
+
862
+ Parameters
863
+ ----------
864
+ checksum : str
865
+ The Base64-encoded SHA-256 checksum of the data to be uploaded.
866
+
867
+ Returns
868
+ -------
869
+ PresignedUrlData
870
+ The presigned URL data containing the storage ID and upload URL.
871
+
872
+ Raises
873
+ ------
874
+ qctrlclient.exceptions.GraphQLClientError
875
+ If the GraphQL query execution fails.
876
+ """
877
+ query = gql.gql(
878
+ """
879
+ mutation ($input: CreatePresignedUrlUploadInput!) {
880
+ createPresignedUrlUpload(input: $input) {
881
+ presignedUrlData {
882
+ id: storageId
883
+ url
884
+ }
885
+ errors {
886
+ fields
887
+ message
888
+ }
889
+ }
890
+ }
891
+ """
892
+ )
893
+
894
+ response = self._client.execute(
895
+ query,
896
+ variable_values={
897
+ "input": {
898
+ "clientApp": self._settings.product.value.registry,
899
+ "checksum": checksum,
900
+ }
901
+ },
902
+ )
903
+ return response["createPresignedUrlUpload"]["presignedUrlData"]
904
+
841
905
 
842
906
  class ParallelCollector:
843
907
  """
@@ -148,7 +148,7 @@ def _get_package_name(module: ModuleType) -> str:
148
148
  Path.joinpath(Path(module.__path__[0]).parent, "pyproject.toml"), "rb"
149
149
  ) as file:
150
150
  config = tomli.load(file)
151
- return config["tool"]["poetry"]["name"]
151
+ return config["project"]["name"]
152
152
 
153
153
 
154
154
  def get_package_versions(package_names: list[str]) -> list[tuple[str, str]]: