cmsdials 2.0.0rc2__tar.gz → 2.0.0rc4__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.
- cmsdials-2.0.0rc4/.gitlab-ci.yml +74 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/PKG-INFO +1 -1
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/_version.py +3 -3
- cmsdials-2.0.0rc4/cmsdials/clients/mes/client.py +17 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/ml_bad_lumisection/models.py +0 -1
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/ml_models_index/models.py +1 -1
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/run/models.py +1 -0
- cmsdials-2.0.0rc4/cmsdials/clients/workspace/client.py +49 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/cmsdials.py +2 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials.egg-info/PKG-INFO +1 -1
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials.egg-info/SOURCES.txt +3 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/pyproject.toml +2 -2
- cmsdials-2.0.0rc4/tests/integration/env.py +15 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/tests/integration/test_auth_client.py +6 -9
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/tests/integration/test_file_index_client.py +12 -9
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/tests/integration/test_h1d_client.py +34 -9
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/tests/integration/test_h2d_client.py +34 -9
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/tests/integration/test_lumisection_client.py +13 -9
- cmsdials-2.0.0rc4/tests/integration/test_mes_client.py +31 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/tests/integration/test_oms_proxy_client.py +9 -8
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/tests/integration/test_resume.py +8 -7
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/tests/integration/test_run_client.py +12 -9
- cmsdials-2.0.0rc4/tests/integration/utils.py +9 -0
- cmsdials-2.0.0rc4/tests/unit/__init__.py +0 -0
- cmsdials-2.0.0rc2/.gitlab-ci.yml +0 -129
- cmsdials-2.0.0rc2/cmsdials/clients/mes/client.py +0 -36
- cmsdials-2.0.0rc2/tests/integration/test_mes_client.py +0 -49
- cmsdials-2.0.0rc2/tests/integration/utils.py +0 -15
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/.coveragerc +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/.editorconfig +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/.gitignore +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/.mailmap +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/.pre-commit-config.yaml +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/.tool-versions +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/LICENSE +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/README.md +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/__init__.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/auth/__init__.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/auth/_base.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/auth/bearer.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/auth/client.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/auth/exceptions.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/auth/models.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/auth/secret_key.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/__init__.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/dataset_index/__init__.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/dataset_index/client.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/dataset_index/models.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/file_index/__init__.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/file_index/client.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/file_index/models.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/h1d/__init__.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/h1d/client.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/h1d/models.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/h2d/__init__.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/h2d/client.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/h2d/models.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/lumisection/__init__.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/lumisection/client.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/lumisection/models.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/mes/__init__.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/mes/models.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/ml_bad_lumisection/__init__.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/ml_bad_lumisection/client.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/ml_models_index/__init__.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/ml_models_index/client.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/oms_proxy/__init__.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/oms_proxy/client.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/oms_proxy/models.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/run/__init__.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/run/client.py +0 -0
- {cmsdials-2.0.0rc2/cmsdials/utils → cmsdials-2.0.0rc4/cmsdials/clients/workspace}/__init__.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/filters.py +0 -0
- {cmsdials-2.0.0rc2/tests/integration → cmsdials-2.0.0rc4/cmsdials/utils}/__init__.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/utils/_json.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/utils/api_client.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/utils/base_model.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/utils/logger.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials.egg-info/dependency_links.txt +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials.egg-info/requires.txt +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials.egg-info/top_level.txt +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/mypy.ini +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/pytest.ini +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/ruff.toml +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/setup.cfg +0 -0
- {cmsdials-2.0.0rc2/tests/unit → cmsdials-2.0.0rc4/tests/integration}/__init__.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/tests/unit/test_base_api_client.py +0 -0
- {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/tox.ini +0 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
include:
|
|
2
|
+
- project: "cms-ppd/technical-support/ci-templates"
|
|
3
|
+
ref: release/v1
|
|
4
|
+
file:
|
|
5
|
+
- "templates/python/uv_build.yml"
|
|
6
|
+
- "templates/python/uv_publish.yml"
|
|
7
|
+
- "templates/gitlab/create_release.yml"
|
|
8
|
+
|
|
9
|
+
stages:
|
|
10
|
+
- test
|
|
11
|
+
- build
|
|
12
|
+
- publish
|
|
13
|
+
- create_release
|
|
14
|
+
|
|
15
|
+
###########
|
|
16
|
+
# Run tests
|
|
17
|
+
###########
|
|
18
|
+
|
|
19
|
+
test_matrix:
|
|
20
|
+
stage: test
|
|
21
|
+
parallel:
|
|
22
|
+
matrix:
|
|
23
|
+
- PYTHON_VERSION: ["3.9", "3.10", "3.11", "3.12"]
|
|
24
|
+
image: registry.cern.ch/docker.io/library/python:$PYTHON_VERSION
|
|
25
|
+
before_script:
|
|
26
|
+
- python -m pip install --upgrade pip
|
|
27
|
+
- pip install uv
|
|
28
|
+
- uv sync --all-groups --extra pandas --extra tqdm
|
|
29
|
+
script:
|
|
30
|
+
- uv run ruff format --check cmsdials tests
|
|
31
|
+
- uv run ruff check cmsdials tests
|
|
32
|
+
- uv run mypy cmsdials tests
|
|
33
|
+
- uv run pytest tests
|
|
34
|
+
coverage: "/TOTAL.+ ([0-9]{1,3}%)/"
|
|
35
|
+
artifacts:
|
|
36
|
+
reports:
|
|
37
|
+
coverage_report:
|
|
38
|
+
coverage_format: cobertura
|
|
39
|
+
path: coverage.xml
|
|
40
|
+
variables:
|
|
41
|
+
SECRET_KEY: "$SECRET_KEY"
|
|
42
|
+
|
|
43
|
+
###############
|
|
44
|
+
# Build package
|
|
45
|
+
###############
|
|
46
|
+
|
|
47
|
+
build:
|
|
48
|
+
extends: .uv_build
|
|
49
|
+
variables:
|
|
50
|
+
UV_SYNC_FLAGS: "--all-groups --extra pandas --extra tqdm"
|
|
51
|
+
needs:
|
|
52
|
+
- test_matrix
|
|
53
|
+
|
|
54
|
+
#################
|
|
55
|
+
# Publish to PyPI
|
|
56
|
+
#################
|
|
57
|
+
|
|
58
|
+
publish:
|
|
59
|
+
extends: .uv_publish
|
|
60
|
+
rules:
|
|
61
|
+
- if: $CI_COMMIT_TAG
|
|
62
|
+
needs:
|
|
63
|
+
- build
|
|
64
|
+
|
|
65
|
+
##########################
|
|
66
|
+
# Create release in GitLab
|
|
67
|
+
##########################
|
|
68
|
+
|
|
69
|
+
create_release:
|
|
70
|
+
extends: .create_gitlab_release
|
|
71
|
+
rules:
|
|
72
|
+
- if: $CI_COMMIT_TAG
|
|
73
|
+
needs:
|
|
74
|
+
- publish
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cmsdials
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.0rc4
|
|
4
4
|
Summary: The Python api client interface to DIALS service
|
|
5
5
|
Author-email: Gabriel Moreira <gabriel.moreira@cern.ch>
|
|
6
6
|
Project-URL: Repository, https://gitlab.cern.ch/cms-dqmdc/libraries/dials-py
|
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '2.0.
|
|
32
|
-
__version_tuple__ = version_tuple = (2, 0, 0, '
|
|
31
|
+
__version__ = version = '2.0.0rc4'
|
|
32
|
+
__version_tuple__ = version_tuple = (2, 0, 0, 'rc4')
|
|
33
33
|
|
|
34
|
-
__commit_id__ = commit_id = '
|
|
34
|
+
__commit_id__ = commit_id = 'g68ff6a70a'
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from ...utils.api_client import BaseAuthorizedNonPaginatedAPIClient
|
|
2
|
+
from .models import MEFilters, MonitoringElement
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class MonitoringElementClient(
|
|
6
|
+
BaseAuthorizedNonPaginatedAPIClient[
|
|
7
|
+
MonitoringElement,
|
|
8
|
+
MEFilters,
|
|
9
|
+
]
|
|
10
|
+
):
|
|
11
|
+
data_model = MonitoringElement
|
|
12
|
+
filter_class = MEFilters
|
|
13
|
+
lookup_url = "mes/"
|
|
14
|
+
|
|
15
|
+
def get(self, id: int, **kwargs): # noqa: A002
|
|
16
|
+
edp = f"{id}/"
|
|
17
|
+
return super()._get(edp, **kwargs)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
from requests.adapters import DEFAULT_RETRIES
|
|
2
|
+
from requests.exceptions import HTTPError
|
|
3
|
+
|
|
4
|
+
from ...auth._base import BaseCredentials
|
|
5
|
+
from ...utils.api_client import BaseAPIClient
|
|
6
|
+
from ...utils.logger import logger
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class WorkspaceClient(BaseAPIClient):
|
|
10
|
+
default_timeout = 30
|
|
11
|
+
lookup_url = "auth/"
|
|
12
|
+
|
|
13
|
+
def __init__(
|
|
14
|
+
self,
|
|
15
|
+
creds: BaseCredentials,
|
|
16
|
+
*args: str,
|
|
17
|
+
**kwargs: str,
|
|
18
|
+
) -> None:
|
|
19
|
+
super().__init__(*args, **kwargs)
|
|
20
|
+
self.creds = creds
|
|
21
|
+
|
|
22
|
+
def _build_headers(self) -> dict:
|
|
23
|
+
base = {"Accept": "application/json", "User-Agent": self._build_user_agent()}
|
|
24
|
+
self.creds.before_request(base)
|
|
25
|
+
return base
|
|
26
|
+
|
|
27
|
+
def __get(self, endpoint: str, retries=DEFAULT_RETRIES):
|
|
28
|
+
headers = self._build_headers()
|
|
29
|
+
endpoint_url = self.api_url + self.lookup_url + endpoint
|
|
30
|
+
|
|
31
|
+
response = self._requests_get_retriable(
|
|
32
|
+
endpoint_url,
|
|
33
|
+
headers=headers,
|
|
34
|
+
timeout=self.default_timeout,
|
|
35
|
+
retries=retries,
|
|
36
|
+
)
|
|
37
|
+
try:
|
|
38
|
+
response.raise_for_status()
|
|
39
|
+
except HTTPError as err:
|
|
40
|
+
logger.info(f"Api raw response: {response.text}")
|
|
41
|
+
raise err
|
|
42
|
+
|
|
43
|
+
return response.json()
|
|
44
|
+
|
|
45
|
+
def list(self, retries=DEFAULT_RETRIES):
|
|
46
|
+
return self.__get("workspaces", retries=retries)
|
|
47
|
+
|
|
48
|
+
def my_workspace(self, retries=DEFAULT_RETRIES):
|
|
49
|
+
return self.__get("user-default-workspace", retries=retries)
|
|
@@ -11,6 +11,7 @@ from .clients.ml_bad_lumisection.client import MLBadLumisectionClient
|
|
|
11
11
|
from .clients.ml_models_index.client import MLModelsIndexClient
|
|
12
12
|
from .clients.oms_proxy.client import OMSProxyClient
|
|
13
13
|
from .clients.run.client import RunClient
|
|
14
|
+
from .clients.workspace.client import WorkspaceClient
|
|
14
15
|
|
|
15
16
|
|
|
16
17
|
class Dials:
|
|
@@ -25,3 +26,4 @@ class Dials:
|
|
|
25
26
|
self.oms = OMSProxyClient(creds, *args, **kwargs)
|
|
26
27
|
self.ml_bad_lumis = MLBadLumisectionClient(creds, workspace, *args, **kwargs)
|
|
27
28
|
self.ml_models_index = MLModelsIndexClient(creds, workspace, *args, **kwargs)
|
|
29
|
+
self.workspace = WorkspaceClient(creds, *args, **kwargs)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cmsdials
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.0rc4
|
|
4
4
|
Summary: The Python api client interface to DIALS service
|
|
5
5
|
Author-email: Gabriel Moreira <gabriel.moreira@cern.ch>
|
|
6
6
|
Project-URL: Repository, https://gitlab.cern.ch/cms-dqmdc/libraries/dials-py
|
|
@@ -59,12 +59,15 @@ cmsdials/clients/oms_proxy/models.py
|
|
|
59
59
|
cmsdials/clients/run/__init__.py
|
|
60
60
|
cmsdials/clients/run/client.py
|
|
61
61
|
cmsdials/clients/run/models.py
|
|
62
|
+
cmsdials/clients/workspace/__init__.py
|
|
63
|
+
cmsdials/clients/workspace/client.py
|
|
62
64
|
cmsdials/utils/__init__.py
|
|
63
65
|
cmsdials/utils/_json.py
|
|
64
66
|
cmsdials/utils/api_client.py
|
|
65
67
|
cmsdials/utils/base_model.py
|
|
66
68
|
cmsdials/utils/logger.py
|
|
67
69
|
tests/integration/__init__.py
|
|
70
|
+
tests/integration/env.py
|
|
68
71
|
tests/integration/test_auth_client.py
|
|
69
72
|
tests/integration/test_file_index_client.py
|
|
70
73
|
tests/integration/test_h1d_client.py
|
|
@@ -38,10 +38,10 @@ Repository = "https://gitlab.cern.ch/cms-dqmdc/libraries/dials-py"
|
|
|
38
38
|
|
|
39
39
|
[dependency-groups]
|
|
40
40
|
lint = [
|
|
41
|
-
"mypy
|
|
41
|
+
"mypy==1.15.0",
|
|
42
42
|
"pandas-stubs>=2.2.2.240807",
|
|
43
43
|
"pre-commit>=4.2.0",
|
|
44
|
-
"ruff
|
|
44
|
+
"ruff==0.11.4",
|
|
45
45
|
"types-requests>=2.31.0.6",
|
|
46
46
|
"types-tqdm>=4.67.0.20250516",
|
|
47
47
|
]
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import os
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
SECRET_KEY = os.getenv("SECRET_KEY")
|
|
5
|
+
if not SECRET_KEY:
|
|
6
|
+
raise OSError("SECRET_KEY environment variable is not set.")
|
|
7
|
+
|
|
8
|
+
BASE_URL = os.getenv("BASE_URL", "https://dev-cmsdials-api.web.cern.ch/")
|
|
9
|
+
TEST_WORKSPACE = os.getenv("TEST_WORKSPACE", "global")
|
|
10
|
+
TEST_DATASET_ID = int(os.getenv("TEST_DATASET_ID", 15310647)) # /ZeroBias/Run2025B-PromptReco-v1/DQMIO
|
|
11
|
+
TEST_FILE_ID = int(
|
|
12
|
+
os.getenv("TEST_FILE_ID", 22961052797)
|
|
13
|
+
) # /store/data/Run2025B/ZeroBias/DQMIO/PromptReco-v1/000/392/158/00000/DC769215-780F-4D7D-B0B7-E66F731E3FC0.root
|
|
14
|
+
TEST_RUN_NUMBER = int(os.getenv("TEST_RUN_NUMBER", 392158))
|
|
15
|
+
TEST_LS_NUMBER = int(os.getenv("TEST_LS_NUMBER", 10))
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import os
|
|
2
1
|
from datetime import datetime, timedelta
|
|
3
2
|
from typing import Union
|
|
4
3
|
|
|
@@ -10,21 +9,19 @@ from cmsdials.auth.bearer import Credentials as BearerCredentials
|
|
|
10
9
|
from cmsdials.auth.client import AuthClient
|
|
11
10
|
from cmsdials.auth.models import Token
|
|
12
11
|
from cmsdials.auth.secret_key import Credentials as SecretKeyCredentials
|
|
13
|
-
from cmsdials.clients.h1d.models import LumisectionHistogram1D
|
|
14
12
|
|
|
15
|
-
|
|
16
|
-
BASE_URL = os.getenv("BASE_URL")
|
|
13
|
+
from .env import BASE_URL, SECRET_KEY, TEST_WORKSPACE
|
|
17
14
|
|
|
18
15
|
|
|
19
16
|
def __setup_dials_from_creds_and_test(creds: Union[SecretKeyCredentials, BearerCredentials]) -> None:
|
|
20
|
-
dials = Dials(creds, base_url=BASE_URL)
|
|
21
|
-
|
|
22
|
-
|
|
17
|
+
dials = Dials(creds, workspace=TEST_WORKSPACE, base_url=BASE_URL)
|
|
18
|
+
# just test if we can access the workspace endpoints
|
|
19
|
+
dials.workspace.my_workspace()
|
|
20
|
+
dials.workspace.list()
|
|
23
21
|
|
|
24
22
|
|
|
25
23
|
def test_secret_key_success() -> None:
|
|
26
|
-
|
|
27
|
-
creds = SecretKeyCredentials(token=secret_key)
|
|
24
|
+
creds = SecretKeyCredentials(token=SECRET_KEY)
|
|
28
25
|
__setup_dials_from_creds_and_test(creds)
|
|
29
26
|
|
|
30
27
|
|
|
@@ -4,44 +4,47 @@ from urllib3.util import Retry
|
|
|
4
4
|
from cmsdials.clients.file_index.models import FileIndex, PaginatedFileIndexList
|
|
5
5
|
from cmsdials.filters import FileIndexFilters
|
|
6
6
|
|
|
7
|
-
from .
|
|
7
|
+
from .env import TEST_DATASET_ID, TEST_FILE_ID
|
|
8
|
+
from .utils import setup_dials_object
|
|
8
9
|
|
|
9
10
|
|
|
10
11
|
def test_get_file_index() -> None:
|
|
11
|
-
dials = setup_dials_object(
|
|
12
|
-
data = dials.file_index.get(dataset_id=
|
|
12
|
+
dials = setup_dials_object()
|
|
13
|
+
data = dials.file_index.get(dataset_id=TEST_DATASET_ID, file_id=TEST_FILE_ID)
|
|
13
14
|
assert isinstance(data, FileIndex)
|
|
14
15
|
|
|
15
16
|
|
|
16
17
|
def test_list_file_index() -> None:
|
|
17
|
-
dials = setup_dials_object(
|
|
18
|
+
dials = setup_dials_object()
|
|
18
19
|
data = dials.file_index.list()
|
|
19
20
|
assert isinstance(data, PaginatedFileIndexList)
|
|
20
21
|
assert isinstance(data.to_pandas(), pd.DataFrame)
|
|
21
22
|
|
|
22
23
|
|
|
23
24
|
def test_list_all_file_index() -> None:
|
|
24
|
-
dials = setup_dials_object(
|
|
25
|
+
dials = setup_dials_object()
|
|
25
26
|
data = dials.file_index.list_all(FileIndexFilters(), max_pages=5)
|
|
26
27
|
assert isinstance(data, PaginatedFileIndexList)
|
|
27
28
|
assert isinstance(data.to_pandas(), pd.DataFrame)
|
|
28
29
|
|
|
29
30
|
|
|
30
31
|
def test_get_file_index_with_retries() -> None:
|
|
31
|
-
dials = setup_dials_object(
|
|
32
|
-
data = dials.file_index.get(
|
|
32
|
+
dials = setup_dials_object()
|
|
33
|
+
data = dials.file_index.get(
|
|
34
|
+
dataset_id=TEST_DATASET_ID, file_id=TEST_FILE_ID, retries=Retry(total=3, backoff_factor=0.1)
|
|
35
|
+
)
|
|
33
36
|
assert isinstance(data, FileIndex)
|
|
34
37
|
|
|
35
38
|
|
|
36
39
|
def test_list_file_index_with_retries() -> None:
|
|
37
|
-
dials = setup_dials_object(
|
|
40
|
+
dials = setup_dials_object()
|
|
38
41
|
data = dials.file_index.list(retries=Retry(total=3, backoff_factor=0.1))
|
|
39
42
|
assert isinstance(data, PaginatedFileIndexList)
|
|
40
43
|
assert isinstance(data.to_pandas(), pd.DataFrame)
|
|
41
44
|
|
|
42
45
|
|
|
43
46
|
def test_list_all_file_index_with_retries() -> None:
|
|
44
|
-
dials = setup_dials_object(
|
|
47
|
+
dials = setup_dials_object()
|
|
45
48
|
data = dials.file_index.list_all(FileIndexFilters(), max_pages=5, retries=Retry(total=3, backoff_factor=0.1))
|
|
46
49
|
assert isinstance(data, PaginatedFileIndexList)
|
|
47
50
|
assert isinstance(data.to_pandas(), pd.DataFrame)
|
|
@@ -4,46 +4,71 @@ from urllib3.util import Retry
|
|
|
4
4
|
from cmsdials.clients.h1d.models import LumisectionHistogram1D, PaginatedLumisectionHistogram1DList
|
|
5
5
|
from cmsdials.filters import LumisectionHistogram1DFilters
|
|
6
6
|
|
|
7
|
-
from .
|
|
7
|
+
from .env import TEST_DATASET_ID, TEST_LS_NUMBER, TEST_RUN_NUMBER
|
|
8
|
+
from .utils import setup_dials_object
|
|
8
9
|
|
|
9
10
|
|
|
10
11
|
def test_get_h1d() -> None:
|
|
11
|
-
dials = setup_dials_object(
|
|
12
|
-
|
|
12
|
+
dials = setup_dials_object()
|
|
13
|
+
|
|
14
|
+
# Fetch any valid monitoring element ID with dimension 1 from the MEs endpoint
|
|
15
|
+
data = dials.mes.list()
|
|
16
|
+
me_id = None
|
|
17
|
+
for me in data:
|
|
18
|
+
if me.dim == 1:
|
|
19
|
+
me_id = me.me_id
|
|
20
|
+
break
|
|
21
|
+
assert me_id is not None, "No 1D Monitoring Element found in MEs endpoint"
|
|
22
|
+
|
|
23
|
+
data = dials.h1d.get(dataset_id=TEST_DATASET_ID, run_number=TEST_RUN_NUMBER, ls_number=TEST_LS_NUMBER, me_id=me_id)
|
|
13
24
|
assert isinstance(data, LumisectionHistogram1D)
|
|
14
25
|
|
|
15
26
|
|
|
16
27
|
def test_list_h1d() -> None:
|
|
17
|
-
dials = setup_dials_object(
|
|
28
|
+
dials = setup_dials_object()
|
|
18
29
|
data = dials.h1d.list()
|
|
19
30
|
assert isinstance(data, PaginatedLumisectionHistogram1DList)
|
|
20
31
|
assert isinstance(data.to_pandas(), pd.DataFrame)
|
|
21
32
|
|
|
22
33
|
|
|
23
34
|
def test_list_all_h1d() -> None:
|
|
24
|
-
dials = setup_dials_object(
|
|
35
|
+
dials = setup_dials_object()
|
|
25
36
|
data = dials.h1d.list_all(LumisectionHistogram1DFilters(), max_pages=5)
|
|
26
37
|
assert isinstance(data, PaginatedLumisectionHistogram1DList)
|
|
27
38
|
assert isinstance(data.to_pandas(), pd.DataFrame)
|
|
28
39
|
|
|
29
40
|
|
|
30
41
|
def test_get_h1d_with_retries() -> None:
|
|
31
|
-
dials = setup_dials_object(
|
|
42
|
+
dials = setup_dials_object()
|
|
43
|
+
|
|
44
|
+
# Fetch any valid monitoring element ID with dimension 1 from the MEs endpoint
|
|
45
|
+
data = dials.mes.list()
|
|
46
|
+
me_id = None
|
|
47
|
+
for me in data:
|
|
48
|
+
if me.dim == 1:
|
|
49
|
+
me_id = me.me_id
|
|
50
|
+
break
|
|
51
|
+
assert me_id is not None, "No 1D Monitoring Element found in MEs endpoint"
|
|
52
|
+
|
|
32
53
|
data = dials.h1d.get(
|
|
33
|
-
dataset_id=
|
|
54
|
+
dataset_id=TEST_DATASET_ID,
|
|
55
|
+
run_number=TEST_RUN_NUMBER,
|
|
56
|
+
ls_number=TEST_LS_NUMBER,
|
|
57
|
+
me_id=me_id,
|
|
58
|
+
retries=Retry(total=3, backoff_factor=0.1),
|
|
34
59
|
)
|
|
35
60
|
assert isinstance(data, LumisectionHistogram1D)
|
|
36
61
|
|
|
37
62
|
|
|
38
63
|
def test_list_h1d_with_retries() -> None:
|
|
39
|
-
dials = setup_dials_object(
|
|
64
|
+
dials = setup_dials_object()
|
|
40
65
|
data = dials.h1d.list(retries=Retry(total=3, backoff_factor=0.1))
|
|
41
66
|
assert isinstance(data, PaginatedLumisectionHistogram1DList)
|
|
42
67
|
assert isinstance(data.to_pandas(), pd.DataFrame)
|
|
43
68
|
|
|
44
69
|
|
|
45
70
|
def test_list_all_h1d_with_retries() -> None:
|
|
46
|
-
dials = setup_dials_object(
|
|
71
|
+
dials = setup_dials_object()
|
|
47
72
|
data = dials.h1d.list_all(LumisectionHistogram1DFilters(), max_pages=5, retries=Retry(total=5, backoff_factor=0.1))
|
|
48
73
|
assert isinstance(data, PaginatedLumisectionHistogram1DList)
|
|
49
74
|
assert isinstance(data.to_pandas(), pd.DataFrame)
|
|
@@ -4,46 +4,71 @@ from urllib3.util import Retry
|
|
|
4
4
|
from cmsdials.clients.h2d.models import LumisectionHistogram2D, PaginatedLumisectionHistogram2DList
|
|
5
5
|
from cmsdials.filters import LumisectionHistogram2DFilters
|
|
6
6
|
|
|
7
|
-
from .
|
|
7
|
+
from .env import TEST_DATASET_ID, TEST_LS_NUMBER, TEST_RUN_NUMBER
|
|
8
|
+
from .utils import setup_dials_object
|
|
8
9
|
|
|
9
10
|
|
|
10
11
|
def test_get_h2d() -> None:
|
|
11
|
-
dials = setup_dials_object(
|
|
12
|
-
|
|
12
|
+
dials = setup_dials_object()
|
|
13
|
+
|
|
14
|
+
# Fetch any valid monitoring element ID with dimension 2 from the MEs endpoint
|
|
15
|
+
data = dials.mes.list()
|
|
16
|
+
me_id = None
|
|
17
|
+
for me in data:
|
|
18
|
+
if me.dim == 2:
|
|
19
|
+
me_id = me.me_id
|
|
20
|
+
break
|
|
21
|
+
assert me_id is not None, "No 2D Monitoring Element found in MEs endpoint"
|
|
22
|
+
|
|
23
|
+
data = dials.h2d.get(dataset_id=TEST_DATASET_ID, run_number=TEST_RUN_NUMBER, ls_number=TEST_LS_NUMBER, me_id=me_id)
|
|
13
24
|
assert isinstance(data, LumisectionHistogram2D)
|
|
14
25
|
|
|
15
26
|
|
|
16
27
|
def test_list_h2d() -> None:
|
|
17
|
-
dials = setup_dials_object(
|
|
28
|
+
dials = setup_dials_object()
|
|
18
29
|
data = dials.h2d.list()
|
|
19
30
|
assert isinstance(data, PaginatedLumisectionHistogram2DList)
|
|
20
31
|
assert isinstance(data.to_pandas(), pd.DataFrame)
|
|
21
32
|
|
|
22
33
|
|
|
23
34
|
def test_list_all_h2d() -> None:
|
|
24
|
-
dials = setup_dials_object(
|
|
35
|
+
dials = setup_dials_object()
|
|
25
36
|
data = dials.h2d.list_all(LumisectionHistogram2DFilters(), max_pages=5)
|
|
26
37
|
assert isinstance(data, PaginatedLumisectionHistogram2DList)
|
|
27
38
|
assert isinstance(data.to_pandas(), pd.DataFrame)
|
|
28
39
|
|
|
29
40
|
|
|
30
41
|
def test_get_h2d_with_retries() -> None:
|
|
31
|
-
dials = setup_dials_object(
|
|
42
|
+
dials = setup_dials_object()
|
|
43
|
+
|
|
44
|
+
# Fetch any valid monitoring element ID with dimension 2 from the MEs endpoint
|
|
45
|
+
data = dials.mes.list()
|
|
46
|
+
me_id = None
|
|
47
|
+
for me in data:
|
|
48
|
+
if me.dim == 2:
|
|
49
|
+
me_id = me.me_id
|
|
50
|
+
break
|
|
51
|
+
assert me_id is not None, "No 2D Monitoring Element found in MEs endpoint"
|
|
52
|
+
|
|
32
53
|
data = dials.h2d.get(
|
|
33
|
-
dataset_id=
|
|
54
|
+
dataset_id=TEST_DATASET_ID,
|
|
55
|
+
run_number=TEST_RUN_NUMBER,
|
|
56
|
+
ls_number=TEST_LS_NUMBER,
|
|
57
|
+
me_id=me_id,
|
|
58
|
+
retries=Retry(total=3, backoff_factor=0.1),
|
|
34
59
|
)
|
|
35
60
|
assert isinstance(data, LumisectionHistogram2D)
|
|
36
61
|
|
|
37
62
|
|
|
38
63
|
def test_list_h2d_with_retries() -> None:
|
|
39
|
-
dials = setup_dials_object(
|
|
64
|
+
dials = setup_dials_object()
|
|
40
65
|
data = dials.h2d.list(retries=Retry(total=3, backoff_factor=0.1))
|
|
41
66
|
assert isinstance(data, PaginatedLumisectionHistogram2DList)
|
|
42
67
|
assert isinstance(data.to_pandas(), pd.DataFrame)
|
|
43
68
|
|
|
44
69
|
|
|
45
70
|
def test_list_all_h2d_with_retries() -> None:
|
|
46
|
-
dials = setup_dials_object(
|
|
71
|
+
dials = setup_dials_object()
|
|
47
72
|
data = dials.h2d.list_all(LumisectionHistogram2DFilters(), max_pages=5, retries=Retry(total=5, backoff_factor=0.1))
|
|
48
73
|
assert isinstance(data, PaginatedLumisectionHistogram2DList)
|
|
49
74
|
assert isinstance(data.to_pandas(), pd.DataFrame)
|
|
@@ -4,46 +4,50 @@ from urllib3.util import Retry
|
|
|
4
4
|
from cmsdials.clients.lumisection.models import Lumisection, PaginatedLumisectionList
|
|
5
5
|
from cmsdials.filters import LumisectionFilters
|
|
6
6
|
|
|
7
|
-
from .
|
|
7
|
+
from .env import TEST_DATASET_ID, TEST_LS_NUMBER, TEST_RUN_NUMBER
|
|
8
|
+
from .utils import setup_dials_object
|
|
8
9
|
|
|
9
10
|
|
|
10
11
|
def test_get_lumisection() -> None:
|
|
11
|
-
dials = setup_dials_object(
|
|
12
|
-
data = dials.lumi.get(dataset_id=
|
|
12
|
+
dials = setup_dials_object()
|
|
13
|
+
data = dials.lumi.get(dataset_id=TEST_DATASET_ID, run_number=TEST_RUN_NUMBER, ls_number=TEST_LS_NUMBER)
|
|
13
14
|
assert isinstance(data, Lumisection)
|
|
14
15
|
|
|
15
16
|
|
|
16
17
|
def test_list_lumisection() -> None:
|
|
17
|
-
dials = setup_dials_object(
|
|
18
|
+
dials = setup_dials_object()
|
|
18
19
|
data = dials.lumi.list()
|
|
19
20
|
assert isinstance(data, PaginatedLumisectionList)
|
|
20
21
|
assert isinstance(data.to_pandas(), pd.DataFrame)
|
|
21
22
|
|
|
22
23
|
|
|
23
24
|
def test_list_all_lumisection() -> None:
|
|
24
|
-
dials = setup_dials_object(
|
|
25
|
+
dials = setup_dials_object()
|
|
25
26
|
data = dials.lumi.list_all(LumisectionFilters(), max_pages=5)
|
|
26
27
|
assert isinstance(data, PaginatedLumisectionList)
|
|
27
28
|
assert isinstance(data.to_pandas(), pd.DataFrame)
|
|
28
29
|
|
|
29
30
|
|
|
30
31
|
def test_get_lumisection_with_retries() -> None:
|
|
31
|
-
dials = setup_dials_object(
|
|
32
|
+
dials = setup_dials_object()
|
|
32
33
|
data = dials.lumi.get(
|
|
33
|
-
dataset_id=
|
|
34
|
+
dataset_id=TEST_DATASET_ID,
|
|
35
|
+
run_number=TEST_RUN_NUMBER,
|
|
36
|
+
ls_number=TEST_LS_NUMBER,
|
|
37
|
+
retries=Retry(total=3, backoff_factor=0.1),
|
|
34
38
|
)
|
|
35
39
|
assert isinstance(data, Lumisection)
|
|
36
40
|
|
|
37
41
|
|
|
38
42
|
def test_list_lumisection_with_retries() -> None:
|
|
39
|
-
dials = setup_dials_object(
|
|
43
|
+
dials = setup_dials_object()
|
|
40
44
|
data = dials.lumi.list(retries=Retry(total=3, backoff_factor=0.1))
|
|
41
45
|
assert isinstance(data, PaginatedLumisectionList)
|
|
42
46
|
assert isinstance(data.to_pandas(), pd.DataFrame)
|
|
43
47
|
|
|
44
48
|
|
|
45
49
|
def test_list_all_lumisection_with_retries() -> None:
|
|
46
|
-
dials = setup_dials_object(
|
|
50
|
+
dials = setup_dials_object()
|
|
47
51
|
data = dials.lumi.list_all(LumisectionFilters(), max_pages=5, retries=Retry(total=3, backoff_factor=0.1))
|
|
48
52
|
assert isinstance(data, PaginatedLumisectionList)
|
|
49
53
|
assert isinstance(data.to_pandas(), pd.DataFrame)
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
from urllib3.util import Retry
|
|
2
|
+
|
|
3
|
+
from cmsdials.clients.mes.models import MonitoringElement
|
|
4
|
+
|
|
5
|
+
from .utils import setup_dials_object
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def test_get_mes() -> None:
|
|
9
|
+
dials = setup_dials_object()
|
|
10
|
+
data = dials.mes.get(id=1)
|
|
11
|
+
assert isinstance(data, MonitoringElement)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def test_list_mes() -> None:
|
|
15
|
+
dials = setup_dials_object()
|
|
16
|
+
data = dials.mes.list()
|
|
17
|
+
for me in data:
|
|
18
|
+
assert isinstance(me, MonitoringElement)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def test_get_mes_with_retries() -> None:
|
|
22
|
+
dials = setup_dials_object()
|
|
23
|
+
data = dials.mes.get(id=1, retries=Retry(total=3, backoff_factor=0.1))
|
|
24
|
+
assert isinstance(data, MonitoringElement)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def test_list_mes_with_retries() -> None:
|
|
28
|
+
dials = setup_dials_object()
|
|
29
|
+
data = dials.mes.list(retries=Retry(total=3, backoff_factor=0.1))
|
|
30
|
+
for me in data:
|
|
31
|
+
assert isinstance(me, MonitoringElement)
|
|
@@ -1,22 +1,23 @@
|
|
|
1
1
|
from cmsdials.filters import OMSFilter, OMSPage
|
|
2
2
|
|
|
3
|
-
from .
|
|
3
|
+
from .env import TEST_RUN_NUMBER
|
|
4
|
+
from .utils import setup_dials_object
|
|
4
5
|
|
|
5
6
|
|
|
6
7
|
def test_query_runs() -> None:
|
|
7
|
-
dials = setup_dials_object(
|
|
8
|
+
dials = setup_dials_object()
|
|
8
9
|
data = dials.oms.query(
|
|
9
|
-
endpoint="runs", filters=[OMSFilter(attribute_name="run_number", value=
|
|
10
|
+
endpoint="runs", filters=[OMSFilter(attribute_name="run_number", value=TEST_RUN_NUMBER, operator="EQ")]
|
|
10
11
|
)
|
|
11
12
|
assert isinstance(data, dict)
|
|
12
13
|
assert data["meta"]["totalResourceCount"] == 1
|
|
13
14
|
|
|
14
15
|
|
|
15
16
|
def test_query_lumisections() -> None:
|
|
16
|
-
dials = setup_dials_object(
|
|
17
|
+
dials = setup_dials_object()
|
|
17
18
|
data = dials.oms.query(
|
|
18
19
|
endpoint="lumisections",
|
|
19
|
-
filters=[OMSFilter(attribute_name="run_number", value=
|
|
20
|
+
filters=[OMSFilter(attribute_name="run_number", value=TEST_RUN_NUMBER, operator="EQ")],
|
|
20
21
|
pages=[OMSPage(attribute_name="limit", value=5000)],
|
|
21
22
|
)
|
|
22
23
|
assert isinstance(data, dict)
|
|
@@ -24,14 +25,14 @@ def test_query_lumisections() -> None:
|
|
|
24
25
|
|
|
25
26
|
|
|
26
27
|
def test_query_datasetrates() -> None:
|
|
27
|
-
dials = setup_dials_object(
|
|
28
|
+
dials = setup_dials_object()
|
|
28
29
|
data = dials.oms.query(
|
|
29
30
|
endpoint="datasetrates",
|
|
30
31
|
filters=[
|
|
31
|
-
OMSFilter(attribute_name="run_number", value=
|
|
32
|
+
OMSFilter(attribute_name="run_number", value=TEST_RUN_NUMBER, operator="EQ"),
|
|
32
33
|
OMSFilter(attribute_name="dataset_name", value="ZeroBias", operator="EQ"),
|
|
33
34
|
],
|
|
34
35
|
pages=[OMSPage(attribute_name="limit", value=5000)],
|
|
35
36
|
)
|
|
36
37
|
assert isinstance(data, dict)
|
|
37
|
-
assert data["meta"]["totalResourceCount"]
|
|
38
|
+
assert data["meta"]["totalResourceCount"] == 98
|
|
@@ -2,19 +2,20 @@ from urllib3.util import Retry
|
|
|
2
2
|
|
|
3
3
|
from cmsdials.filters import LumisectionHistogram2DFilters
|
|
4
4
|
|
|
5
|
-
from .
|
|
5
|
+
from .env import TEST_LS_NUMBER
|
|
6
|
+
from .utils import setup_dials_object
|
|
6
7
|
|
|
7
8
|
|
|
8
9
|
def test_resume() -> None:
|
|
9
|
-
dials = setup_dials_object(
|
|
10
|
+
dials = setup_dials_object()
|
|
10
11
|
data = dials.h2d.list_all(
|
|
11
|
-
LumisectionHistogram2DFilters(me__regex="PXBarrel", ls_number=
|
|
12
|
+
LumisectionHistogram2DFilters(me__regex="PXBarrel", ls_number=TEST_LS_NUMBER, entries__gte=100),
|
|
12
13
|
max_pages=10,
|
|
13
14
|
keep_failed=True,
|
|
14
15
|
)
|
|
15
16
|
assert len(data.results) == 100
|
|
16
17
|
data = dials.h2d.list_all(
|
|
17
|
-
LumisectionHistogram2DFilters(me__regex="PXBarrel", ls_number=
|
|
18
|
+
LumisectionHistogram2DFilters(me__regex="PXBarrel", ls_number=TEST_LS_NUMBER, entries__gte=100),
|
|
18
19
|
max_pages=10,
|
|
19
20
|
keep_failed=True,
|
|
20
21
|
resume_from=data,
|
|
@@ -25,16 +26,16 @@ def test_resume() -> None:
|
|
|
25
26
|
|
|
26
27
|
|
|
27
28
|
def test_resume_with_retries() -> None:
|
|
28
|
-
dials = setup_dials_object(
|
|
29
|
+
dials = setup_dials_object()
|
|
29
30
|
data = dials.h2d.list_all(
|
|
30
|
-
LumisectionHistogram2DFilters(me__regex="PXBarrel", ls_number=
|
|
31
|
+
LumisectionHistogram2DFilters(me__regex="PXBarrel", ls_number=TEST_LS_NUMBER, entries__gte=100),
|
|
31
32
|
max_pages=10,
|
|
32
33
|
keep_failed=True,
|
|
33
34
|
retries=Retry(total=3, backoff_factor=0.1),
|
|
34
35
|
)
|
|
35
36
|
assert len(data.results) == 100
|
|
36
37
|
data = dials.h2d.list_all(
|
|
37
|
-
LumisectionHistogram2DFilters(me__regex="PXBarrel", ls_number=
|
|
38
|
+
LumisectionHistogram2DFilters(me__regex="PXBarrel", ls_number=TEST_LS_NUMBER, entries__gte=100),
|
|
38
39
|
max_pages=10,
|
|
39
40
|
keep_failed=True,
|
|
40
41
|
resume_from=data,
|
|
@@ -4,44 +4,47 @@ from urllib3.util import Retry
|
|
|
4
4
|
from cmsdials.clients.run.models import PaginatedRunList, Run
|
|
5
5
|
from cmsdials.filters import RunFilters
|
|
6
6
|
|
|
7
|
-
from .
|
|
7
|
+
from .env import TEST_DATASET_ID, TEST_RUN_NUMBER
|
|
8
|
+
from .utils import setup_dials_object
|
|
8
9
|
|
|
9
10
|
|
|
10
11
|
def test_get_run() -> None:
|
|
11
|
-
dials = setup_dials_object(
|
|
12
|
-
data = dials.run.get(dataset_id=
|
|
12
|
+
dials = setup_dials_object()
|
|
13
|
+
data = dials.run.get(dataset_id=TEST_DATASET_ID, run_number=TEST_RUN_NUMBER)
|
|
13
14
|
assert isinstance(data, Run)
|
|
14
15
|
|
|
15
16
|
|
|
16
17
|
def test_list_run() -> None:
|
|
17
|
-
dials = setup_dials_object(
|
|
18
|
+
dials = setup_dials_object()
|
|
18
19
|
data = dials.run.list()
|
|
19
20
|
assert isinstance(data, PaginatedRunList)
|
|
20
21
|
assert isinstance(data.to_pandas(), pd.DataFrame)
|
|
21
22
|
|
|
22
23
|
|
|
23
24
|
def test_list_all_run() -> None:
|
|
24
|
-
dials = setup_dials_object(
|
|
25
|
+
dials = setup_dials_object()
|
|
25
26
|
data = dials.run.list_all(RunFilters(), max_pages=5)
|
|
26
27
|
assert isinstance(data, PaginatedRunList)
|
|
27
28
|
assert isinstance(data.to_pandas(), pd.DataFrame)
|
|
28
29
|
|
|
29
30
|
|
|
30
31
|
def test_get_run_with_retries() -> None:
|
|
31
|
-
dials = setup_dials_object(
|
|
32
|
-
data = dials.run.get(
|
|
32
|
+
dials = setup_dials_object()
|
|
33
|
+
data = dials.run.get(
|
|
34
|
+
dataset_id=TEST_DATASET_ID, run_number=TEST_RUN_NUMBER, retries=Retry(total=3, backoff_factor=0.1)
|
|
35
|
+
)
|
|
33
36
|
assert isinstance(data, Run)
|
|
34
37
|
|
|
35
38
|
|
|
36
39
|
def test_list_run_with_retries() -> None:
|
|
37
|
-
dials = setup_dials_object(
|
|
40
|
+
dials = setup_dials_object()
|
|
38
41
|
data = dials.run.list(retries=Retry(total=3, backoff_factor=0.1))
|
|
39
42
|
assert isinstance(data, PaginatedRunList)
|
|
40
43
|
assert isinstance(data.to_pandas(), pd.DataFrame)
|
|
41
44
|
|
|
42
45
|
|
|
43
46
|
def test_list_all_run_with_retries() -> None:
|
|
44
|
-
dials = setup_dials_object(
|
|
47
|
+
dials = setup_dials_object()
|
|
45
48
|
data = dials.run.list_all(RunFilters(), max_pages=5, retries=Retry(total=3, backoff_factor=0.1))
|
|
46
49
|
assert isinstance(data, PaginatedRunList)
|
|
47
50
|
assert isinstance(data.to_pandas(), pd.DataFrame)
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
from cmsdials import Dials
|
|
2
|
+
from cmsdials.auth.secret_key import Credentials
|
|
3
|
+
|
|
4
|
+
from .env import BASE_URL, SECRET_KEY, TEST_WORKSPACE
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def setup_dials_object() -> Dials:
|
|
8
|
+
creds = Credentials(token=SECRET_KEY)
|
|
9
|
+
return Dials(creds, base_url=BASE_URL, workspace=TEST_WORKSPACE)
|
|
File without changes
|
cmsdials-2.0.0rc2/.gitlab-ci.yml
DELETED
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
stages:
|
|
2
|
-
- test
|
|
3
|
-
- build
|
|
4
|
-
- publish
|
|
5
|
-
- create_release
|
|
6
|
-
|
|
7
|
-
test_matrix:
|
|
8
|
-
stage: test
|
|
9
|
-
parallel:
|
|
10
|
-
matrix:
|
|
11
|
-
- PYTHON_VERSION: ["3.9", "3.10", "3.11", "3.12"]
|
|
12
|
-
image: registry.cern.ch/docker.io/library/python:$PYTHON_VERSION
|
|
13
|
-
before_script:
|
|
14
|
-
- python -m pip install --upgrade pip
|
|
15
|
-
- pip install uv
|
|
16
|
-
- uv sync --all-groups --extra pandas --extra tqdm
|
|
17
|
-
script:
|
|
18
|
-
- uv run ruff check cmsdials tests
|
|
19
|
-
- uv run mypy cmsdials tests
|
|
20
|
-
- uv run pytest tests
|
|
21
|
-
coverage: "/TOTAL.+ ([0-9]{1,3}%)/"
|
|
22
|
-
artifacts:
|
|
23
|
-
reports:
|
|
24
|
-
coverage_report:
|
|
25
|
-
coverage_format: cobertura
|
|
26
|
-
path: coverage.xml
|
|
27
|
-
variables:
|
|
28
|
-
SECRET_KEY: "$SECRET_KEY"
|
|
29
|
-
|
|
30
|
-
build:
|
|
31
|
-
stage: build
|
|
32
|
-
image: registry.cern.ch/docker.io/library/python:3.12
|
|
33
|
-
before_script:
|
|
34
|
-
- python -m pip install --upgrade pip
|
|
35
|
-
- pip install uv
|
|
36
|
-
- uv sync --all-groups --extra pandas --extra tqdm
|
|
37
|
-
script:
|
|
38
|
-
- rm -rf dist/
|
|
39
|
-
- uv build
|
|
40
|
-
artifacts:
|
|
41
|
-
paths:
|
|
42
|
-
- dist/
|
|
43
|
-
expire_in: 1 hour
|
|
44
|
-
needs:
|
|
45
|
-
- test_matrix
|
|
46
|
-
|
|
47
|
-
publish:
|
|
48
|
-
stage: publish
|
|
49
|
-
image: registry.cern.ch/docker.io/library/python:3.12
|
|
50
|
-
rules:
|
|
51
|
-
- if: '$CI_COMMIT_TAG'
|
|
52
|
-
when: always
|
|
53
|
-
- when: never
|
|
54
|
-
before_script:
|
|
55
|
-
- python -m pip install --upgrade pip
|
|
56
|
-
- pip install uv
|
|
57
|
-
script:
|
|
58
|
-
- uv publish # UV_PUBLISH_TOKEN has to be set in CI/CD variables
|
|
59
|
-
needs:
|
|
60
|
-
- build
|
|
61
|
-
|
|
62
|
-
create_release:
|
|
63
|
-
stage: create_release
|
|
64
|
-
image: registry.cern.ch/registry.gitlab.com/gitlab-org/cli:latest
|
|
65
|
-
rules:
|
|
66
|
-
- if: $CI_COMMIT_TAG
|
|
67
|
-
variables:
|
|
68
|
-
# GITLAB_TOKEN has to be set in CI/CD variables - Project Access Token with api access permission
|
|
69
|
-
GITLAB_HOST: $CI_SERVER_FQDN
|
|
70
|
-
before_script:
|
|
71
|
-
- apk add jq --no-cache
|
|
72
|
-
script:
|
|
73
|
-
- |
|
|
74
|
-
set -x
|
|
75
|
-
|
|
76
|
-
# Fetch all tags
|
|
77
|
-
git fetch --tags
|
|
78
|
-
|
|
79
|
-
# Try to get the previous tag
|
|
80
|
-
PREV_TAG=$(git describe --tags --abbrev=0 "${CI_COMMIT_TAG}^" 2>/dev/null || true)
|
|
81
|
-
|
|
82
|
-
if [ -z "$PREV_TAG" ]; then
|
|
83
|
-
echo "Generating release for ${CI_COMMIT_TAG} - No previous tag found, assuming this is the first release."
|
|
84
|
-
COMMIT_RANGE_LINEAR_COMP=""
|
|
85
|
-
COMMIT_RANGE_SYMMETRIC_DIFF=""
|
|
86
|
-
else
|
|
87
|
-
echo "Generating release for ${CI_COMMIT_TAG} (MRs since ${PREV_TAG})"
|
|
88
|
-
COMMIT_RANGE_LINEAR_COMP="${PREV_TAG}..${CI_COMMIT_TAG}"
|
|
89
|
-
COMMIT_RANGE_SYMMETRIC_DIFF="${PREV_TAG}...${CI_COMMIT_TAG}"
|
|
90
|
-
fi
|
|
91
|
-
|
|
92
|
-
# Setup auth
|
|
93
|
-
glab auth login --token "$GITLAB_TOKEN"
|
|
94
|
-
|
|
95
|
-
# Generate release notes
|
|
96
|
-
if [ -z "$COMMIT_RANGE_LINEAR_COMP" ]; then
|
|
97
|
-
echo "### First release: ${CI_COMMIT_TAG}:" > release_notes.md
|
|
98
|
-
echo "" >> release_notes.md
|
|
99
|
-
else
|
|
100
|
-
echo "### Changes since ${PREV_TAG}:" > release_notes.md
|
|
101
|
-
echo "" >> release_notes.md
|
|
102
|
-
echo "[${COMMIT_RANGE_SYMMETRIC_DIFF}]($CI_PROJECT_URL/-/compare/${COMMIT_RANGE_SYMMETRIC_DIFF})" >> release_notes.md
|
|
103
|
-
echo "" >> release_notes.md
|
|
104
|
-
fi
|
|
105
|
-
|
|
106
|
-
# Get MR numbers between the two tags by parsing commit messages
|
|
107
|
-
MR_NUMBERS=$(git log ${COMMIT_RANGE_LINEAR_COMP} --merges --pretty=format:"%b" | grep -oE '!([0-9]+)' | tr -d '!' | sort -u)
|
|
108
|
-
|
|
109
|
-
# Update release notes, fallback to commit list if merge request list is empty
|
|
110
|
-
if [ -z "$MR_NUMBERS" ]; then
|
|
111
|
-
COMMIT_LIST=$(git log --pretty=format:"- #%h from %an <%ae>: %s" ${COMMIT_RANGE_LINEAR_COMP})
|
|
112
|
-
echo "${COMMIT_LIST}" >> release_notes.md
|
|
113
|
-
else
|
|
114
|
-
for mr in $MR_NUMBERS; do
|
|
115
|
-
echo "Fetching MR $mr metadata"
|
|
116
|
-
mr_metadata=$(glab mr view "$mr" -R "$CI_PROJECT_PATH" -F json)
|
|
117
|
-
mr_web_url=$(echo "$mr_metadata" | jq -r '.web_url')
|
|
118
|
-
title=$(echo "$mr_metadata" | jq -r '.title')
|
|
119
|
-
author_username=$(echo "$mr_metadata" | jq -r '.author.username')
|
|
120
|
-
author_username_web_url=$(echo "$mr_metadata" | jq -r '.author.web_url')
|
|
121
|
-
echo "- [!${mr}](${mr_web_url}) from [@${author_username}](${author_username_web_url}): ${title}" >> release_notes.md
|
|
122
|
-
done
|
|
123
|
-
fi
|
|
124
|
-
|
|
125
|
-
# Create the release
|
|
126
|
-
echo "Creating release for tag $CI_COMMIT_TAG"
|
|
127
|
-
glab release create "${CI_COMMIT_TAG}" -R "$CI_PROJECT_PATH" -F release_notes.md
|
|
128
|
-
needs:
|
|
129
|
-
- publish
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import warnings
|
|
2
|
-
from typing import Union
|
|
3
|
-
|
|
4
|
-
from requests.adapters import DEFAULT_RETRIES
|
|
5
|
-
from urllib3.util import Retry
|
|
6
|
-
|
|
7
|
-
from ...utils.api_client import BaseAuthorizedNonPaginatedAPIClient
|
|
8
|
-
from .models import MEFilters, MonitoringElement
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class MonitoringElementClient(
|
|
12
|
-
BaseAuthorizedNonPaginatedAPIClient[
|
|
13
|
-
MonitoringElement,
|
|
14
|
-
MEFilters,
|
|
15
|
-
]
|
|
16
|
-
):
|
|
17
|
-
data_model = MonitoringElement
|
|
18
|
-
filter_class = MEFilters
|
|
19
|
-
lookup_url = "mes/"
|
|
20
|
-
|
|
21
|
-
def get(self, id: int, **kwargs): # noqa: A002
|
|
22
|
-
edp = f"{id}/"
|
|
23
|
-
return super()._get(edp, **kwargs)
|
|
24
|
-
|
|
25
|
-
def list_all(self, filters: MEFilters, retries: Union[int, Retry] = DEFAULT_RETRIES, **kwargs):
|
|
26
|
-
"""
|
|
27
|
-
This method is here just for the sake of compatibility.
|
|
28
|
-
In the past, this class and other paginated classes used to inherit from the same class.
|
|
29
|
-
"""
|
|
30
|
-
warnings.warn(
|
|
31
|
-
"The `list_all` method is deprecated and will be removed in the future for non-paginated classes. "
|
|
32
|
-
"Please use the `list` method instead.",
|
|
33
|
-
DeprecationWarning,
|
|
34
|
-
stacklevel=2, # Important: ensures the warning points to the caller
|
|
35
|
-
)
|
|
36
|
-
return super().list(filters, retries=retries, **kwargs)
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import pytest
|
|
2
|
-
from urllib3.util import Retry
|
|
3
|
-
|
|
4
|
-
from cmsdials.clients.mes.models import MonitoringElement
|
|
5
|
-
from cmsdials.filters import MEFilters
|
|
6
|
-
|
|
7
|
-
from .utils import DEFAULT_TEST_WORKSPACE, setup_dials_object
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
def test_get_mes() -> None:
|
|
11
|
-
dials = setup_dials_object(workspace=DEFAULT_TEST_WORKSPACE)
|
|
12
|
-
data = dials.mes.get(id=1)
|
|
13
|
-
assert isinstance(data, MonitoringElement)
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def test_list_mes() -> None:
|
|
17
|
-
dials = setup_dials_object(workspace=DEFAULT_TEST_WORKSPACE)
|
|
18
|
-
data = dials.mes.list()
|
|
19
|
-
for me in data:
|
|
20
|
-
assert isinstance(me, MonitoringElement)
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
def test_list_all_mes() -> None:
|
|
24
|
-
dials = setup_dials_object(workspace=DEFAULT_TEST_WORKSPACE)
|
|
25
|
-
with pytest.warns(DeprecationWarning, match="list_all"):
|
|
26
|
-
data = dials.mes.list_all(MEFilters())
|
|
27
|
-
for me in data:
|
|
28
|
-
assert isinstance(me, MonitoringElement)
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
def test_get_mes_with_retries() -> None:
|
|
32
|
-
dials = setup_dials_object(workspace=DEFAULT_TEST_WORKSPACE)
|
|
33
|
-
data = dials.mes.get(id=1, retries=Retry(total=3, backoff_factor=0.1))
|
|
34
|
-
assert isinstance(data, MonitoringElement)
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
def test_list_mes_with_retries() -> None:
|
|
38
|
-
dials = setup_dials_object(workspace=DEFAULT_TEST_WORKSPACE)
|
|
39
|
-
data = dials.mes.list(retries=Retry(total=3, backoff_factor=0.1))
|
|
40
|
-
for me in data:
|
|
41
|
-
assert isinstance(me, MonitoringElement)
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
def test_list_all_mes_with_retries() -> None:
|
|
45
|
-
dials = setup_dials_object(workspace=DEFAULT_TEST_WORKSPACE)
|
|
46
|
-
with pytest.warns(DeprecationWarning, match="list_all"):
|
|
47
|
-
data = dials.mes.list_all(MEFilters(), retries=Retry(total=3, backoff_factor=0.1))
|
|
48
|
-
for me in data:
|
|
49
|
-
assert isinstance(me, MonitoringElement)
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import os
|
|
2
|
-
from typing import Optional
|
|
3
|
-
|
|
4
|
-
from cmsdials import Dials
|
|
5
|
-
from cmsdials.auth.secret_key import Credentials
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
DEFAULT_TEST_WORKSPACE = "tracker"
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def setup_dials_object(workspace: Optional[str] = None) -> Dials:
|
|
12
|
-
secret_key = os.getenv("SECRET_KEY")
|
|
13
|
-
base_url = os.getenv("BASE_URL")
|
|
14
|
-
creds = Credentials(token=secret_key)
|
|
15
|
-
return Dials(creds, base_url=base_url, workspace=workspace)
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cmsdials-2.0.0rc2/cmsdials/utils → cmsdials-2.0.0rc4/cmsdials/clients/workspace}/__init__.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
|