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.
Files changed (88) hide show
  1. cmsdials-2.0.0rc4/.gitlab-ci.yml +74 -0
  2. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/PKG-INFO +1 -1
  3. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/_version.py +3 -3
  4. cmsdials-2.0.0rc4/cmsdials/clients/mes/client.py +17 -0
  5. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/ml_bad_lumisection/models.py +0 -1
  6. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/ml_models_index/models.py +1 -1
  7. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/run/models.py +1 -0
  8. cmsdials-2.0.0rc4/cmsdials/clients/workspace/client.py +49 -0
  9. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/cmsdials.py +2 -0
  10. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials.egg-info/PKG-INFO +1 -1
  11. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials.egg-info/SOURCES.txt +3 -0
  12. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/pyproject.toml +2 -2
  13. cmsdials-2.0.0rc4/tests/integration/env.py +15 -0
  14. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/tests/integration/test_auth_client.py +6 -9
  15. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/tests/integration/test_file_index_client.py +12 -9
  16. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/tests/integration/test_h1d_client.py +34 -9
  17. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/tests/integration/test_h2d_client.py +34 -9
  18. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/tests/integration/test_lumisection_client.py +13 -9
  19. cmsdials-2.0.0rc4/tests/integration/test_mes_client.py +31 -0
  20. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/tests/integration/test_oms_proxy_client.py +9 -8
  21. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/tests/integration/test_resume.py +8 -7
  22. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/tests/integration/test_run_client.py +12 -9
  23. cmsdials-2.0.0rc4/tests/integration/utils.py +9 -0
  24. cmsdials-2.0.0rc4/tests/unit/__init__.py +0 -0
  25. cmsdials-2.0.0rc2/.gitlab-ci.yml +0 -129
  26. cmsdials-2.0.0rc2/cmsdials/clients/mes/client.py +0 -36
  27. cmsdials-2.0.0rc2/tests/integration/test_mes_client.py +0 -49
  28. cmsdials-2.0.0rc2/tests/integration/utils.py +0 -15
  29. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/.coveragerc +0 -0
  30. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/.editorconfig +0 -0
  31. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/.gitignore +0 -0
  32. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/.mailmap +0 -0
  33. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/.pre-commit-config.yaml +0 -0
  34. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/.tool-versions +0 -0
  35. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/LICENSE +0 -0
  36. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/README.md +0 -0
  37. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/__init__.py +0 -0
  38. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/auth/__init__.py +0 -0
  39. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/auth/_base.py +0 -0
  40. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/auth/bearer.py +0 -0
  41. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/auth/client.py +0 -0
  42. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/auth/exceptions.py +0 -0
  43. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/auth/models.py +0 -0
  44. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/auth/secret_key.py +0 -0
  45. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/__init__.py +0 -0
  46. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/dataset_index/__init__.py +0 -0
  47. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/dataset_index/client.py +0 -0
  48. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/dataset_index/models.py +0 -0
  49. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/file_index/__init__.py +0 -0
  50. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/file_index/client.py +0 -0
  51. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/file_index/models.py +0 -0
  52. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/h1d/__init__.py +0 -0
  53. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/h1d/client.py +0 -0
  54. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/h1d/models.py +0 -0
  55. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/h2d/__init__.py +0 -0
  56. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/h2d/client.py +0 -0
  57. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/h2d/models.py +0 -0
  58. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/lumisection/__init__.py +0 -0
  59. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/lumisection/client.py +0 -0
  60. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/lumisection/models.py +0 -0
  61. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/mes/__init__.py +0 -0
  62. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/mes/models.py +0 -0
  63. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/ml_bad_lumisection/__init__.py +0 -0
  64. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/ml_bad_lumisection/client.py +0 -0
  65. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/ml_models_index/__init__.py +0 -0
  66. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/ml_models_index/client.py +0 -0
  67. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/oms_proxy/__init__.py +0 -0
  68. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/oms_proxy/client.py +0 -0
  69. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/oms_proxy/models.py +0 -0
  70. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/run/__init__.py +0 -0
  71. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/clients/run/client.py +0 -0
  72. {cmsdials-2.0.0rc2/cmsdials/utils → cmsdials-2.0.0rc4/cmsdials/clients/workspace}/__init__.py +0 -0
  73. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/filters.py +0 -0
  74. {cmsdials-2.0.0rc2/tests/integration → cmsdials-2.0.0rc4/cmsdials/utils}/__init__.py +0 -0
  75. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/utils/_json.py +0 -0
  76. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/utils/api_client.py +0 -0
  77. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/utils/base_model.py +0 -0
  78. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials/utils/logger.py +0 -0
  79. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials.egg-info/dependency_links.txt +0 -0
  80. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials.egg-info/requires.txt +0 -0
  81. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/cmsdials.egg-info/top_level.txt +0 -0
  82. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/mypy.ini +0 -0
  83. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/pytest.ini +0 -0
  84. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/ruff.toml +0 -0
  85. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/setup.cfg +0 -0
  86. {cmsdials-2.0.0rc2/tests/unit → cmsdials-2.0.0rc4/tests/integration}/__init__.py +0 -0
  87. {cmsdials-2.0.0rc2 → cmsdials-2.0.0rc4}/tests/unit/test_base_api_client.py +0 -0
  88. {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.0rc2
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.0rc2'
32
- __version_tuple__ = version_tuple = (2, 0, 0, 'rc2')
31
+ __version__ = version = '2.0.0rc4'
32
+ __version_tuple__ = version_tuple = (2, 0, 0, 'rc4')
33
33
 
34
- __commit_id__ = commit_id = 'g20833ad4f'
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)
@@ -8,7 +8,6 @@ from ...utils.base_model import PaginatedBaseFilters, PaginatedBaseModel
8
8
  class MLBadLumisection(BaseModel):
9
9
  model_id: int
10
10
  dataset_id: int
11
- file_id: int
12
11
  run_number: int
13
12
  ls_number: int
14
13
  metric_value: float
@@ -18,7 +18,7 @@ class MLModelsIndex(BaseModel):
18
18
  description: str
19
19
  flagging_key: Optional[str]
20
20
  input_signature: list[dict]
21
- metric_key: str
21
+ metric_key: Optional[str]
22
22
  output_signature: list[dict]
23
23
  tags: Optional[list[dict]]
24
24
  isvc_service_name: Optional[str]
@@ -10,6 +10,7 @@ class Run(BaseModel):
10
10
  dataset: str = Field(..., max_length=255)
11
11
  run_number: int
12
12
  ls_count: int
13
+ ls_completeness: Optional[float]
13
14
 
14
15
 
15
16
  class PaginatedRunList(PaginatedBaseModel[Run]):
@@ -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.0rc2
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>=1.15.0",
41
+ "mypy==1.15.0",
42
42
  "pandas-stubs>=2.2.2.240807",
43
43
  "pre-commit>=4.2.0",
44
- "ruff>=0.11.4",
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
- data = dials.h1d.get(dataset_id=14677060, run_number=367112, ls_number=10, me_id=1)
22
- assert isinstance(data, LumisectionHistogram1D)
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
- secret_key = os.getenv("SECRET_KEY")
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 .utils import DEFAULT_TEST_WORKSPACE, setup_dials_object
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(workspace=DEFAULT_TEST_WORKSPACE)
12
- data = dials.file_index.get(dataset_id=14677060, file_id=3393809397)
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(workspace=DEFAULT_TEST_WORKSPACE)
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(workspace=DEFAULT_TEST_WORKSPACE)
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(workspace=DEFAULT_TEST_WORKSPACE)
32
- data = dials.file_index.get(dataset_id=14677060, file_id=3393809397, retries=Retry(total=3, backoff_factor=0.1))
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(workspace=DEFAULT_TEST_WORKSPACE)
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(workspace=DEFAULT_TEST_WORKSPACE)
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 .utils import DEFAULT_TEST_WORKSPACE, setup_dials_object
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(workspace=DEFAULT_TEST_WORKSPACE)
12
- data = dials.h1d.get(dataset_id=14677060, run_number=367112, ls_number=10, me_id=1)
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(workspace=DEFAULT_TEST_WORKSPACE)
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(workspace=DEFAULT_TEST_WORKSPACE)
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(workspace=DEFAULT_TEST_WORKSPACE)
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=14677060, run_number=367112, ls_number=10, me_id=1, retries=Retry(total=3, backoff_factor=0.1)
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(workspace=DEFAULT_TEST_WORKSPACE)
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(workspace=DEFAULT_TEST_WORKSPACE)
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 .utils import DEFAULT_TEST_WORKSPACE, setup_dials_object
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(workspace=DEFAULT_TEST_WORKSPACE)
12
- data = dials.h2d.get(dataset_id=14677060, run_number=367112, ls_number=10, me_id=100)
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(workspace=DEFAULT_TEST_WORKSPACE)
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(workspace=DEFAULT_TEST_WORKSPACE)
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(workspace=DEFAULT_TEST_WORKSPACE)
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=14677060, run_number=367112, ls_number=10, me_id=100, retries=Retry(total=3, backoff_factor=0.1)
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(workspace=DEFAULT_TEST_WORKSPACE)
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(workspace=DEFAULT_TEST_WORKSPACE)
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 .utils import DEFAULT_TEST_WORKSPACE, setup_dials_object
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(workspace=DEFAULT_TEST_WORKSPACE)
12
- data = dials.lumi.get(dataset_id=14677060, run_number=367112, ls_number=10)
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(workspace=DEFAULT_TEST_WORKSPACE)
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(workspace=DEFAULT_TEST_WORKSPACE)
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(workspace=DEFAULT_TEST_WORKSPACE)
32
+ dials = setup_dials_object()
32
33
  data = dials.lumi.get(
33
- dataset_id=14677060, run_number=367112, ls_number=10, retries=Retry(total=3, backoff_factor=0.1)
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(workspace=DEFAULT_TEST_WORKSPACE)
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(workspace=DEFAULT_TEST_WORKSPACE)
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 .utils import DEFAULT_TEST_WORKSPACE, setup_dials_object
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(workspace=DEFAULT_TEST_WORKSPACE)
8
+ dials = setup_dials_object()
8
9
  data = dials.oms.query(
9
- endpoint="runs", filters=[OMSFilter(attribute_name="run_number", value=382921, operator="EQ")]
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(workspace=DEFAULT_TEST_WORKSPACE)
17
+ dials = setup_dials_object()
17
18
  data = dials.oms.query(
18
19
  endpoint="lumisections",
19
- filters=[OMSFilter(attribute_name="run_number", value=382921, operator="EQ")],
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(workspace=DEFAULT_TEST_WORKSPACE)
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=382921, operator="EQ"),
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"] > 100
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 .utils import DEFAULT_TEST_WORKSPACE, setup_dials_object
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(workspace=DEFAULT_TEST_WORKSPACE)
10
+ dials = setup_dials_object()
10
11
  data = dials.h2d.list_all(
11
- LumisectionHistogram2DFilters(me__regex="PXBarrel", ls_number=78, entries__gte=100),
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=78, entries__gte=100),
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(workspace=DEFAULT_TEST_WORKSPACE)
29
+ dials = setup_dials_object()
29
30
  data = dials.h2d.list_all(
30
- LumisectionHistogram2DFilters(me__regex="PXBarrel", ls_number=78, entries__gte=100),
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=78, entries__gte=100),
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 .utils import DEFAULT_TEST_WORKSPACE, setup_dials_object
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(workspace=DEFAULT_TEST_WORKSPACE)
12
- data = dials.run.get(dataset_id=14677060, run_number=367112)
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(workspace=DEFAULT_TEST_WORKSPACE)
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(workspace=DEFAULT_TEST_WORKSPACE)
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(workspace=DEFAULT_TEST_WORKSPACE)
32
- data = dials.run.get(dataset_id=14677060, run_number=367112, retries=Retry(total=3, backoff_factor=0.1))
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(workspace=DEFAULT_TEST_WORKSPACE)
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(workspace=DEFAULT_TEST_WORKSPACE)
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
@@ -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