cmsdials 0.0.0__py3-none-any.whl

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.

Potentially problematic release.


This version of cmsdials might be problematic. Click here for more details.

Files changed (52) hide show
  1. LICENSE +674 -0
  2. cmsdials/__init__.py +5 -0
  3. cmsdials/_version.py +1 -0
  4. cmsdials/auth/__init__.py +0 -0
  5. cmsdials/auth/_base.py +136 -0
  6. cmsdials/auth/bearer.py +140 -0
  7. cmsdials/auth/client.py +105 -0
  8. cmsdials/auth/exceptions.py +6 -0
  9. cmsdials/auth/models.py +25 -0
  10. cmsdials/auth/secret_key.py +42 -0
  11. cmsdials/clients/__init__.py +0 -0
  12. cmsdials/clients/dataset_index/__init__.py +0 -0
  13. cmsdials/clients/dataset_index/client.py +13 -0
  14. cmsdials/clients/dataset_index/models.py +30 -0
  15. cmsdials/clients/file_index/__init__.py +0 -0
  16. cmsdials/clients/file_index/client.py +13 -0
  17. cmsdials/clients/file_index/models.py +36 -0
  18. cmsdials/clients/h1d/__init__.py +0 -0
  19. cmsdials/clients/h1d/client.py +13 -0
  20. cmsdials/clients/h1d/models.py +47 -0
  21. cmsdials/clients/h2d/__init__.py +0 -0
  22. cmsdials/clients/h2d/client.py +13 -0
  23. cmsdials/clients/h2d/models.py +50 -0
  24. cmsdials/clients/lumisection/__init__.py +0 -0
  25. cmsdials/clients/lumisection/client.py +13 -0
  26. cmsdials/clients/lumisection/models.py +34 -0
  27. cmsdials/clients/mes/__init__.py +0 -0
  28. cmsdials/clients/mes/client.py +12 -0
  29. cmsdials/clients/mes/models.py +18 -0
  30. cmsdials/clients/ml_bad_lumisection/__init__.py +0 -0
  31. cmsdials/clients/ml_bad_lumisection/client.py +29 -0
  32. cmsdials/clients/ml_bad_lumisection/models.py +38 -0
  33. cmsdials/clients/ml_models_index/__init__.py +0 -0
  34. cmsdials/clients/ml_models_index/client.py +13 -0
  35. cmsdials/clients/ml_models_index/models.py +30 -0
  36. cmsdials/clients/oms_proxy/__init__.py +0 -0
  37. cmsdials/clients/oms_proxy/client.py +49 -0
  38. cmsdials/clients/oms_proxy/models.py +14 -0
  39. cmsdials/clients/run/__init__.py +0 -0
  40. cmsdials/clients/run/client.py +13 -0
  41. cmsdials/clients/run/models.py +29 -0
  42. cmsdials/cmsdials.py +27 -0
  43. cmsdials/filters.py +25 -0
  44. cmsdials/utils/__init__.py +0 -0
  45. cmsdials/utils/_json.py +24 -0
  46. cmsdials/utils/api_client.py +226 -0
  47. cmsdials/utils/base_model.py +33 -0
  48. cmsdials/utils/logger.py +6 -0
  49. cmsdials-0.0.0.dist-info/LICENSE +674 -0
  50. cmsdials-0.0.0.dist-info/METADATA +356 -0
  51. cmsdials-0.0.0.dist-info/RECORD +52 -0
  52. cmsdials-0.0.0.dist-info/WHEEL +4 -0
@@ -0,0 +1,356 @@
1
+ Metadata-Version: 2.1
2
+ Name: cmsdials
3
+ Version: 0.0.0
4
+ Summary: The Python api client interface to DIALS service
5
+ Home-page: https://github.com/cms-DQM/dials-py
6
+ Author: Gabriel Moreira
7
+ Author-email: gabrielmscampos@gmail.com
8
+ Requires-Python: >=3.9,<4.0
9
+ Classifier: Development Status :: 5 - Production/Stable
10
+ Classifier: Operating System :: OS Independent
11
+ Classifier: Programming Language :: Python
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: Programming Language :: Python :: 3.9
14
+ Classifier: Programming Language :: Python :: 3.10
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
18
+ Provides-Extra: pandas
19
+ Provides-Extra: tqdm
20
+ Requires-Dist: pandas (>=1.5.3) ; extra == "pandas"
21
+ Requires-Dist: pydantic (>=2.8.2,<3.0.0)
22
+ Requires-Dist: requests (>=2.31.0,<3.0.0)
23
+ Requires-Dist: tqdm (>=4.66.1) ; extra == "tqdm"
24
+ Requires-Dist: urllib3 (>=1.26.16,<2.0.0)
25
+ Project-URL: Repository, https://github.com/cms-DQM/dials-py
26
+ Description-Content-Type: text/markdown
27
+
28
+ ![Build Status](https://gitlab.cern.ch/cms-dqmdc/libraries/dials-py/badges/dev/pipeline.svg)
29
+ ![Coverage](https://gitlab.cern.ch/cms-dqmdc/libraries/dials-py/badges/dev/coverage.svg)
30
+ [![PyPI version](https://badge.fury.io/py/cmsdials.png)](https://badge.fury.io/py/cmsdials)
31
+
32
+ # dials-py
33
+
34
+ The Python api client interface to DIALS service.
35
+
36
+ ## Installation
37
+
38
+ To install dials-py, simply
39
+
40
+ ```bash
41
+ $ pip install cmsdials
42
+ ```
43
+
44
+ It is also possible to specify the following extras, to enable optional features:
45
+
46
+ ```
47
+ pandas, tqdm
48
+ ```
49
+
50
+ ## Usage
51
+
52
+ Before interfacing with any route you need to generate valid credentials, it is possible to authenticate trough the `device authorization flow` or using the `client secret key` of any application registered in DIALS. Note that, the device flow is an interactively authentication procedure that is possible to distinguish users in DIALS backend and the client secret flow is not interactive and is not possible to distinguish users so it should only be used for automation scripts.
53
+
54
+ ### Generating credentials with client secret
55
+
56
+ ```python
57
+ from cmsdials.auth.secret_key import Credentials
58
+
59
+ creds = Credentials(token=".....")
60
+ ```
61
+
62
+ ### Generating credentials with device
63
+
64
+ #### Loading from AuthClient
65
+
66
+ ```python
67
+ from cmsdials.auth.client import AuthClient
68
+ from cmsdials.auth.bearer import Credentials
69
+
70
+ auth = AuthClient()
71
+ token = auth.device_auth_flow()
72
+ creds = Credentials.from_authclient_token(token)
73
+ ```
74
+
75
+ #### Loading from cached credentials file
76
+
77
+ Credentials are always cached once you authenticate at least one time, calling this method without having a cached credential file will automatically trigger the AuthClient device flow.
78
+
79
+ ```python
80
+ from cmsdials.auth.bearer import Credentials
81
+
82
+ creds = Credentials.from_creds_file()
83
+ ```
84
+
85
+ ### Basic Example
86
+
87
+ ```python
88
+ from cmsdials.auth.bearer import Credentials
89
+ from cmsdials import Dials
90
+ from cmsdials.filters import LumisectionHistogram1DFilters
91
+
92
+ creds = Credentials.from_creds_file()
93
+ dials = Dials(creds)
94
+
95
+ # Getting h1d data
96
+ data = dials.h1d.list_all(LumisectionHistogram1DFilters(me="PixelPhase1/Tracks/PXBarrel/charge_PXLayer_2"), max_pages=5)
97
+ ```
98
+
99
+ ### Workspace
100
+
101
+ Users are automatically routed to a workspace based on e-groups, but it is possible to overwrite this configuration and inspect data from others workspaces:
102
+
103
+ ```python
104
+ dials = Dials(creds, workspace="jetmet")
105
+ ```
106
+
107
+ ## Available endpoints
108
+
109
+ This package interacts with DIALS api endpoints using underlying classes in `Dials` object.
110
+
111
+ ### Retrieving a specific object using `get`
112
+
113
+ ```python
114
+ dials.dataset_index.get(dataset_id=14677060)
115
+ dials.file_index.get(dataset_id=14677060, file_id=3393809397)
116
+ dials.h1d.get(dataset_id=14677060, run_number=367112, ls_number=10, me_id=1)
117
+ dials.h1d.get(dataset_id=14677060, run_number=367112, ls_number=10, me_id=96)
118
+ dials.lumi.get(dataset_id=14677060, run_number=367112, ls_number=10)
119
+ dials.run.get(dataset_id=14677060, run_number=367112)
120
+
121
+ # jetmet worskpace
122
+ dials.ml_models_index(model_id=1)
123
+ dials.ml_bad_lumisection(model_id=19, dataset_id=15102369, run_number=386951, ls_number=36)
124
+ ```
125
+
126
+ ### Retrieving a list of objects per page using `list`
127
+
128
+ It is possible to get a list of entries from those endpoint using the `list` and `list_all` methods, the `list` method will fetch only one page and the `list_all` will fetch all available pages:
129
+
130
+ ```python
131
+ dials.dataset_index.list()
132
+ dials.file_index.list()
133
+ dials.h1d.list()
134
+ dials.h2d.list()
135
+ dials.lumi.list()
136
+ dials.run.list()
137
+ dials.ml_models_index.list()
138
+ dials.ml_bad_lumisection.list()
139
+ ```
140
+
141
+ ### Retrieving all available pages of a list of objects using `list_all`
142
+
143
+ Note: Keep in mind that running `list_all` without any filter can take too much time, since you will be retrieving all rows in the database.
144
+
145
+ ```python
146
+ dials.dataset_index.list_all()
147
+ dials.file_index.list_all()
148
+ dials.h1d.list_all()
149
+ dials.h2d.list_all()
150
+ dials.lumi.list_all()
151
+ dials.run.list_all()
152
+ dials.ml_models_index.list_all()
153
+ dials.ml_bad_lumisection.list_all()
154
+ ```
155
+
156
+ If you don't need all available pages but just a subset of then, it is possible to specify a `max_pages` integer parameter:
157
+
158
+ ```python
159
+ dials.run.list_all(..., max_pages=5)
160
+ ```
161
+
162
+ ### Using filters
163
+
164
+ Keep in mind that calling those methods without any filter can take a lot of time, because the underlying query will try to load the entire database table through multiple requests, then it is recommended to apply filters according to DIALS [live documentation](https://cmsdials-api.web.cern.ch/api/v1/swagger#/) using filter classes for each table:
165
+
166
+ ```python
167
+ from cmsdials.filters import (
168
+ FileIndexFilters,
169
+ LumisectionHistogram1DFilters,
170
+ LumisectionHistogram2DFilters,
171
+ LumisectionFilters,
172
+ RunFilters,
173
+ MLBadLumisectionFilters
174
+ )
175
+
176
+ dials.dataset_index.list_all(DatasetIndexFilters(page_size=500))
177
+
178
+ dials.file_index.list(FileIndexFilters(dataset__regex="2024B"))
179
+
180
+ dials.h1d.list(LumisectionHistogram1DFilters(me="PixelPhase1/Tracks/PXBarrel/charge_PXLayer_2"))
181
+
182
+ dials.h2d.list_all(LumisectionHistogram2DFilters(me__regex="PXBarrel", ls_number=78, entries__gte=100), max_pages=5)
183
+
184
+ dials.lumi.list_all(LumisectionFilters(run_number=360392), max_pages=5)
185
+
186
+ dials.run.list_all(RunFilters(run_number__gte=360392, run_number__lte=365000), max_pages=5)
187
+
188
+ # jetmet workspace
189
+ dials.ml_models_index.list_all(MLModelsIndexFilters(active=True))
190
+
191
+ # jetmet workspace
192
+ dials.ml_bad_lumis.list_all(
193
+ MLBadLumisectionFilters(
194
+ page_size=500,
195
+ model_id__in=[20,19],
196
+ dataset_id__in=[15042670],
197
+ run_number__in=[385801,385799,385764]
198
+ )
199
+ )
200
+ ```
201
+
202
+ ### Dials MEs
203
+
204
+ It is possible to inspect the list of ingested MEs in DIALS listing the endpoint `mes` trough the method:
205
+
206
+ ```python
207
+ dials.mes.list()
208
+ ```
209
+
210
+ ### Automatically convert paginated results to pandas DataFrame
211
+
212
+ You can enable this optional feature by installing the package with the `pandas` extra.
213
+
214
+ All `Paginated` metaclasses contain the method `to_pandas` that will automatically transform the `results` attribute of the metaclass into a pandas dataframe, for example:
215
+
216
+ ```python
217
+ data = dials.h1d.list_all(LumisectionHistogram1DFilters(me="PixelPhase1/Tracks/PXBarrel/charge_PXLayer_2"), max_pages=5)
218
+ data.to_pandas()
219
+ ```
220
+
221
+ ### Indefinite progress bar when fetch multi-page result
222
+
223
+ You can enable this optional feature by installing the package with the `tqdm` extra.
224
+
225
+ Whenever you call a `list_all` method that fetches multiple pages a dynamic progress will be rendered to indicate duration and number of pages, for example:
226
+
227
+ ```python
228
+ >>> dials.h2d.list_all(LumisectionHistogram2DFilters(me__regex="PXBarrel", ls_number=78, entries__gte=100), max_pages=5)
229
+ Progress: 100%|█████████████████████████████████████| 5/5 [00:02<00:00, 1.70it/s]
230
+ ```
231
+
232
+ The total attribute of the bar is dynamically updated while fetching the pages.
233
+
234
+ ## Retrying
235
+
236
+ In case of an unstable connection, DNS failures or service overload it is possible to configure any `get`, `list` and `list_all` to retry the underlying requests using native `urllib3` retry class, for example:
237
+
238
+ ```python
239
+ from urllib3.util import Retry
240
+
241
+ data = dials.h1d.get(dataset_id=14677060, run_number=367112, ls_number=10, me_id=1, retries=Retry(total=3, backoff_factor=0.1))
242
+ data = dials.h1d.list(retries=Retry(total=3, backoff_factor=0.1))
243
+ data = dials.h1d.list_all(LumisectionHistogram1DFilters(), max_pages=5, retries=Retry(total=5, backoff_factor=0.1))
244
+ ```
245
+
246
+ ## Resuming
247
+
248
+ When listing and endpoint for a long time, you may loose connection or the server can potentially return an error. By specifying `keep_failed` and using `resume_from` you can resume from an older response object, for example:
249
+
250
+ ```python
251
+ from cmsdials.auth.client import AuthClient
252
+ from cmsdials.auth.bearer import Credentials
253
+ from cmsdials import Dials
254
+ from cmsdials.filters import LumisectionHistogram2DFilters
255
+
256
+ auth = AuthClient()
257
+ creds = Credentials.from_creds_file()
258
+ dials = Dials(creds, workspace="tracker")
259
+
260
+ data = dials.h2d.list_all(LumisectionHistogram2DFilters(me__regex="PXBarrel", ls_number=78, entries__gte=100), keep_failed=True) # Code may broke inside this routine
261
+ print(len(data.results)) # 100
262
+ print(data.exc_type)
263
+ print(data.exc_formatted)
264
+
265
+ # After failing, run this again
266
+ data = dials.h2d.list_all(LumisectionHistogram2DFilters(me__regex="PXBarrel", ls_number=78, entries__gte=100), keep_failed=True, resume_from=data) # Resume from failed object
267
+ print(len(data.results)) # 200
268
+ ```
269
+
270
+ You may find it useful to resume from a partial response, i.e,
271
+
272
+ ```python
273
+ data = dials.h2d.list_all(LumisectionHistogram2DFilters(me__regex="PXBarrel", ls_number=78, entries__gte=100), max_pages=10, keep_failed=True) # Code may not break, however will fetch only 100 elements
274
+ print(len(data.results)) # 100
275
+
276
+ # After fetching first 100, fetch next 100
277
+ data = dials.h2d.list_all(LumisectionHistogram2DFilters(me__regex="PXBarrel", ls_number=78, entries__gte=100), max_pages=10, keep_failed=True, resume_from=data) # Resume from partial object
278
+ print(len(data.results)) # 200
279
+ ```
280
+
281
+ ## Fetching ML certification json and ML golden-like json
282
+
283
+ The following examples are testable in the `jetmet` workspace:
284
+
285
+ ```python
286
+ dials.ml_bad_lumis.cert_json(
287
+ model_id__in=[20,19],
288
+ dataset_id__in=[15042670],
289
+ run_number__in=[385801,385799,385764]
290
+ )
291
+
292
+ dials.ml_bad_lumis.golden_json(
293
+ model_id__in=[20,19],
294
+ dataset_id__in=[15042670],
295
+ run_number__in=[385801,385799,385764]
296
+ )
297
+ ```
298
+
299
+ You may need to query the `ml_models_index` client to fetch the models ids you are interested and the `dataset-index` client to fetch the datasets ids. Take a look in the live documentation to check all possible filters.
300
+
301
+ Attention: Those endpoints doesn't return a Pydantic model, instead they are returning a plain json response. Consequently, the method `to_pandas` doesn't work on them.
302
+
303
+ ## Usage with local DIALS
304
+
305
+ All classes that interface the DIALS service inherits the class `BaseAPIClient` which propagate the `base_url`, `route` and `version` attributes with production values. In order to use dials-py with a local version of DIALS it is possible to overwrite those attributes when instantiating the `AuthClient` and the `Dials` client, for example:
306
+
307
+ ```python
308
+ from cmsdials.auth.client import AuthClient
309
+ from cmsdials.auth.bearer import Credentials
310
+ from cmsdials import Dials
311
+ from cmsdials.filters import LumisectionHistogram2DFilters
312
+
313
+ DEV_URL = "http://localhost:8000/"
314
+ DEV_CACHE_DIR = ".cache-dev"
315
+
316
+ auth = AuthClient(base_url=DEV_URL)
317
+ creds = Credentials.from_creds_file(cache_dir=DEV_CACHE_DIR, client=auth) # Make sure to specify the auth client with overwritten values, using another cache_dir is recommended
318
+ dials = Dials(creds, base_url=DEV_URL)
319
+
320
+ dials.h2d.list_all(LumisectionHistogram2DFilters(me__regex="EEOT digi occupancy EE +", entries__gte=100, run_number__gte=360392, run_number__lte=365000), max_pages=5)
321
+ ```
322
+
323
+ ## Running tests
324
+
325
+ The repository has some tests written to make sure DIALS responses are compatible with pydantic metaclasses, you can use pytest to run all tests but you need to specify a secret key to authenticate non-interactively against DIALS api:
326
+
327
+ ```bash
328
+ SECRET_KEY=... pytest tests --cov=cmsdials --cov-report=xml --cov-report=term --cov-report=html
329
+ ```
330
+
331
+ The secret key is an api client enabled secret key and can be obtained from the applications portal, any api client secret key whitelisted in DIALS can be used. The interactive authentication flow should be tested manually, an example for this can be found in [this line](/tests/integration/test_auth_client.py#L33).
332
+
333
+ If testing against a local version of DIALS you need to specify the BASE_URL:
334
+
335
+ ```bash
336
+ SECRET_KEY=... BASE_URL=http://localhost:8000 pytest tests --cov=cmsdials --cov-report=xml --cov-report=term --cov-report=html
337
+ ```
338
+
339
+ ### Tox
340
+
341
+ Tox is pre-configured in `pyproject.toml`, so you can run the following to test against multiple python versions locally:
342
+
343
+ ```bash
344
+ SECRET_KEY=... poetry run tox
345
+ ```
346
+
347
+ **[asdf](https://asdf-vm.com/) users**
348
+
349
+ tox requires multiple versions of Python to be installed. Using `asdf`, you have multiple versions installed, but they aren’t normally exposed to the current shell. You can use the following command to expose multiple versions of Python in the current directory:
350
+
351
+ ```bash
352
+ asdf set python 3.12.9 3.11.10 3.10.13 3.9.19
353
+ ```
354
+
355
+ This will use `3.12.9` by default (if you just run `python`), but it will also put `python3.11`, `python3.10` and `python3.9` symlinks in your path so you can run those too (which is exactly what tox is looking for).
356
+
@@ -0,0 +1,52 @@
1
+ LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
2
+ cmsdials/__init__.py,sha256=6u_9dbVho3A_mbBPPM4V35nWvsu7JvcYvb0tUruyrQs,99
3
+ cmsdials/_version.py,sha256=lEEx5lwinUby-YNl7w-VFGUcjcibsJ9EuzgJ2W7ocrU,22
4
+ cmsdials/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
+ cmsdials/auth/_base.py,sha256=QrWui91zrEAyIv3OmerArjhmhVCE42LwQkmJ1A3m-AQ,4155
6
+ cmsdials/auth/bearer.py,sha256=1ELbhohDxaPaEOmjGZR-M4OMYYQsDLjinafZDE1hPEE,5027
7
+ cmsdials/auth/client.py,sha256=FINnV2wnPm1tZpox7p405DFW4dHz0G-ZJXHAzmpekVw,3819
8
+ cmsdials/auth/exceptions.py,sha256=h-muYmw5r0lR6jUhre4878NUCnwslO0TEOOpqa7C3W4,112
9
+ cmsdials/auth/models.py,sha256=WMpvKIeelLHEET43PyUiS1hX8nkFZ764Z5DBSwKP0H4,425
10
+ cmsdials/auth/secret_key.py,sha256=a5mPQInAzRYzOmIS3zfd3KYoobKDo5ti2tIFoaekfWs,1050
11
+ cmsdials/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
+ cmsdials/clients/dataset_index/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
+ cmsdials/clients/dataset_index/client.py,sha256=z3tqUBhMpAQUn527vnQuNuUvXa2WSWRCjmFudaqs7es,486
14
+ cmsdials/clients/dataset_index/models.py,sha256=ydIkAk6XuoZzQX7dFQpPOA1a0_PKtZdHyEgFBNjz530,867
15
+ cmsdials/clients/file_index/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
+ cmsdials/clients/file_index/client.py,sha256=ccaS42GvcakGm1XbhvqM6AUi_k__gN5Oh7KyvkxF02Y,462
17
+ cmsdials/clients/file_index/models.py,sha256=A9PCEfnuigx9f3QCe_tURBCvbRXHUzmmGBvoK0m0M68,1022
18
+ cmsdials/clients/h1d/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
+ cmsdials/clients/h1d/client.py,sha256=6yoBTfQFvEgSokyiLAqACRjSVUQMFep9Bc8JM6s4t9o,600
20
+ cmsdials/clients/h1d/models.py,sha256=KRj3LhR6s6m0_8UMbCDkcFIjCoZJr_fzzQRqNu5WHk8,1355
21
+ cmsdials/clients/h2d/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
+ cmsdials/clients/h2d/client.py,sha256=emz6A6XZWM3Cu9tlOka0G5fXz3V0rgYcADC8BdzAIPw,600
23
+ cmsdials/clients/h2d/models.py,sha256=Z_ksEdzH_s60rqKZugxRGCn9S9sbl1vOuoT8drp97IA,1412
24
+ cmsdials/clients/lumisection/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
+ cmsdials/clients/lumisection/client.py,sha256=B4UNMUSDYDmhkOartxo39vbVRTbZnIv96K-LQ8YZF3k,511
26
+ cmsdials/clients/lumisection/models.py,sha256=4g9WQpRzwz2tpdGZHV6mrE3QDVHV6hQ8zr6BOwK1A6s,921
27
+ cmsdials/clients/mes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
+ cmsdials/clients/mes/client.py,sha256=BGEZUNjIEgeKJh-EVhQnG4F54G6RAgw_vQM9DzMOhJ4,369
29
+ cmsdials/clients/mes/models.py,sha256=o-vE1GzOa4Dw7WfvH0OZSbZL0YkQrjCE17NFLMk-za8,359
30
+ cmsdials/clients/ml_bad_lumisection/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
+ cmsdials/clients/ml_bad_lumisection/client.py,sha256=DYKobGgAqTSsHVIihIMIJkiXU0IcWvsApFea--lF0zA,1565
32
+ cmsdials/clients/ml_bad_lumisection/models.py,sha256=BusTqfMWP6YmYRy1EHcIxyQp18NRCsm6XdS6BX5f-58,1020
33
+ cmsdials/clients/ml_models_index/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
+ cmsdials/clients/ml_models_index/client.py,sha256=gj4tym66fo2H4KUiIVvayp1YDZQOLvvYxISTv7C-hWg,467
35
+ cmsdials/clients/ml_models_index/models.py,sha256=bHVkddcx3Al6t6WPcbGU_sc1oviwnJssVSPDg5Hi6jg,770
36
+ cmsdials/clients/oms_proxy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
+ cmsdials/clients/oms_proxy/client.py,sha256=QJgyArJIrRZXEhX_0cBLvZY5AXfi-r-bzwZZOZmxznI,1577
38
+ cmsdials/clients/oms_proxy/models.py,sha256=Y3eskDRbY7dY0wTS6m2BLIal1uOyCwfpOm_MBcf2dLo,288
39
+ cmsdials/clients/run/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
+ cmsdials/clients/run/client.py,sha256=5kidUA_LfDPfIuvM7RaI-cUpWG74lCmkytt_tkYxlWs,419
41
+ cmsdials/clients/run/models.py,sha256=mK0lnrSyM-gRtfYKbKjI75zkXdHK1Qh3wyKkH4g4dYo,732
42
+ cmsdials/cmsdials.py,sha256=uyRiWe-jhPdSHfCu5zx_LBKM_TK6udRQ4-OiIElzsKc,1542
43
+ cmsdials/filters.py,sha256=UOdPvGaIXavU4eYGPuB08jEQQPK5rr1LWk9qqIbiZTM,872
44
+ cmsdials/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
+ cmsdials/utils/_json.py,sha256=_WKrpyIKh2ASr5IGGBGC5z2RlpxifQh2ZRk7H0JxzlQ,671
46
+ cmsdials/utils/api_client.py,sha256=bvfPaFVRSSTEAufY5h4tXB6WILEA-11lSUn0JFES0hc,7557
47
+ cmsdials/utils/base_model.py,sha256=4FprxXfjGgNn55WVlqU_ed9lgxwXExVXkLBac5P0uJc,940
48
+ cmsdials/utils/logger.py,sha256=rD_dY0arc-sU7z7vvzC0_kCwe-3T3VQd3OP2ZBDlEkk,146
49
+ cmsdials-0.0.0.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
50
+ cmsdials-0.0.0.dist-info/METADATA,sha256=NsvDuu-KGRHBZlG74FMOpU0LZm47FGNARdLr9uEEr5I,13624
51
+ cmsdials-0.0.0.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
52
+ cmsdials-0.0.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: poetry-core 1.8.1
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any