cornflow 1.2.0a1__py3-none-any.whl → 1.2.0a3__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.
@@ -16,6 +16,7 @@ from cornflow.tests.const import (
16
16
  INSTANCE_URL,
17
17
  INSTANCES_LIST,
18
18
  INSTANCE_PATH,
19
+ EMPTY_INSTANCE_PATH
19
20
  )
20
21
  from cornflow.tests.custom_test_case import CustomTestCase, BaseTestCases
21
22
  from flask import current_app
@@ -35,6 +36,7 @@ class TestInstancesListEndpoint(BaseTestCases.ListFilters):
35
36
  return temp
36
37
 
37
38
  self.payload = load_file(INSTANCE_PATH)
39
+ self.payload2 = load_file(EMPTY_INSTANCE_PATH)
38
40
  self.payloads = [load_file(f) for f in INSTANCES_LIST]
39
41
  self.keys_to_check = [
40
42
  "data_hash",
@@ -49,6 +51,16 @@ class TestInstancesListEndpoint(BaseTestCases.ListFilters):
49
51
  def test_new_instance(self):
50
52
  self.create_new_row(self.url, self.model, self.payload)
51
53
 
54
+ def test_empty_instance(self):
55
+ """
56
+ testing what happend when empty dictionary get saved
57
+ """
58
+ self.create_new_row(self.url, self.model, self.payload2)
59
+
60
+ active_rows = self.model.query.filter(self.model.deleted_at == None).all()
61
+ has_empty_dict = any(getattr(row, "data", None) == {} for row in active_rows)
62
+ self.assertTrue(has_empty_dict, "Error: Not an empty dicctionary")
63
+
52
64
  def test_new_instance_missing_info(self):
53
65
  del self.payload["data"]["parameters"]
54
66
  self.create_new_row(
@@ -249,7 +249,7 @@ class TestLogInOpenAuth(CustomTestCase):
249
249
  """
250
250
  Tests successful login for an existing service user with valid token
251
251
  """
252
- mock_decode.return_value = {"username": "service_user"}
252
+ mock_decode.return_value = {"sub": "service_user"}
253
253
  response = self.client.post(
254
254
  LOGIN_URL,
255
255
  data=json.dumps({}),
@@ -267,7 +267,7 @@ class TestLogInOpenAuth(CustomTestCase):
267
267
  """
268
268
  Tests successful login and creation of a new user with valid token
269
269
  """
270
- mock_decode.return_value = {"username": "test_user"}
270
+ mock_decode.return_value = {"sub": "test_user"}
271
271
  response = self.client.post(
272
272
  LOGIN_URL,
273
273
  data=json.dumps({}),
@@ -300,11 +300,14 @@ class TestLogInOpenAuth(CustomTestCase):
300
300
  mock_jwt.decode.side_effect = lambda *args, **kwargs: (
301
301
  {"iss": current_app.config["OID_PROVIDER"]}
302
302
  if kwargs.get("options", {}).get("verify_signature") is False
303
- else {"sub": "test_user", "email": "test@test.com"}
303
+ else {"sub": "test_user", "email": "test_user@test.com"}
304
304
  )
305
305
 
306
306
  # Mock verify_token to always return a valid token payload
307
- mock_verify_token.return_value = {"sub": "test_user", "email": "test@test.com"}
307
+ mock_verify_token.return_value = {
308
+ "sub": "test_user",
309
+ "email": "test_user@test.com",
310
+ }
308
311
 
309
312
  # Make first request
310
313
  response = self.client.post(
@@ -500,7 +503,7 @@ class TestLogInOpenAuthService(CustomTestCase):
500
503
  """
501
504
  Tests that a user can successfully log in with a valid token
502
505
  """
503
- mock_decode.return_value = {"username": "testname"}
506
+ mock_decode.return_value = {"sub": "testname"}
504
507
 
505
508
  response = self.client.post(
506
509
  LOGIN_URL,
@@ -1,6 +1,7 @@
1
1
  """
2
2
  Unit test for the role endpoints
3
3
  """
4
+
4
5
  import json
5
6
  import logging as log
6
7
  from cornflow.models import PermissionViewRoleModel, RoleModel
@@ -472,3 +473,40 @@ class TestRolesModelMethods(CustomTestCase):
472
473
  self.token = self.create_user_with_role(ADMIN_ROLE)
473
474
  idx = self.create_new_row(self.url, self.model, self.payload)
474
475
  self.str_method(idx, "<Role test_role>")
476
+
477
+ def test_get_all_objects(self):
478
+ """
479
+ Tests the get_all_objects method
480
+ """
481
+ # We expect 4 roles to be present (from ROLES_MAP constant)
482
+ instances = RoleModel.get_all_objects().all()
483
+ self.assertEqual(len(instances), 4)
484
+
485
+ # Check that all the roles from ROLES_MAP are present
486
+ role_names = [role.name for role in instances]
487
+ expected_names = list(ROLES_MAP.values())
488
+ self.assertCountEqual(role_names, expected_names)
489
+
490
+ # Test offset parameter - should get all except the first role
491
+ instances = RoleModel.get_all_objects(offset=1).all()
492
+ self.assertEqual(len(instances), 3)
493
+
494
+ # Get the names of all roles except the first one
495
+ remaining_roles = [role.name for role in instances]
496
+ # The first role is skipped due to offset=1
497
+ first_role = RoleModel.get_all_objects().first().name
498
+ self.assertNotIn(first_role, remaining_roles)
499
+
500
+ # Test offset and limit parameters
501
+ instances = RoleModel.get_all_objects(offset=1, limit=1).all()
502
+ self.assertEqual(len(instances), 1)
503
+
504
+ # Verify that we get the second role when using offset=1 and limit=1
505
+ second_role = RoleModel.get_all_objects().all()[1]
506
+ self.assertEqual(instances[0].id, second_role.id)
507
+ self.assertEqual(instances[0].name, second_role.name)
508
+
509
+ # Test filtering by name
510
+ instances = RoleModel.get_all_objects(limit=1, name="admin").all()
511
+ self.assertEqual(len(instances), 1)
512
+ self.assertEqual(instances[0].name, "admin")
@@ -1,6 +1,7 @@
1
1
  """
2
2
  Unit test for the token endpoint
3
3
  """
4
+
4
5
  import json
5
6
 
6
7
  from flask import current_app
@@ -92,16 +93,23 @@ class TestUnexpiringToken(CustomTestCase):
92
93
 
93
94
  # Verify that the token decodes correctly
94
95
  response = auth.decode_token(token)
95
- self.assertEqual(response, {"username": "testname"})
96
96
 
97
+ self.assertIn("iat", response)
98
+ self.assertIn("iss", response)
99
+ self.assertIn("sub", response)
100
+ self.assertEqual("testname", response["sub"])
97
101
  # Don't use hardcoded token, generate another dynamic one
98
102
  user = UserModel.get_one_user(1)
99
103
  self.assertIsNotNone(user)
100
-
104
+
101
105
  # Verify that another generated token also works
102
106
  token2 = auth.generate_token(1)
103
107
  response2 = auth.decode_token(token2)
104
- self.assertEqual(response2, {"username": "testname"})
108
+
109
+ self.assertIn("iat", response2)
110
+ self.assertIn("iss", response2)
111
+ self.assertIn("sub", response2)
112
+ self.assertEqual("testname", response2["sub"])
105
113
 
106
114
  def test_user_not_valid(self):
107
115
  auth = BIAuth()
@@ -1,8 +1,22 @@
1
+ """
2
+ Unit tests for the user endpoints.
3
+
4
+ This module contains tests for the user-related functionalities, including:
5
+ - User authentication and authorization
6
+ - User role management
7
+ - Password handling and rotation
8
+ - User profile operations
9
+
10
+ All tests follow a consistent pattern of setting up test data,
11
+ executing operations, and verifying results against expected outcomes.
12
+ """
13
+
1
14
  import json
15
+ from datetime import datetime, timedelta, timezone
2
16
 
3
17
  from flask import current_app
4
18
  from flask_testing import TestCase
5
- from datetime import datetime, timedelta
19
+
6
20
  from cornflow.app import create_app
7
21
  from cornflow.commands.access import access_init_command
8
22
  from cornflow.commands.dag import register_deployed_dags_command_test
@@ -15,9 +29,8 @@ from cornflow.models import (
15
29
  UserModel,
16
30
  UserRoleModel,
17
31
  )
18
-
19
- from cornflow.shared.const import ADMIN_ROLE, PLANNER_ROLE, SERVICE_ROLE, VIEWER_ROLE
20
32
  from cornflow.shared import db
33
+ from cornflow.shared.const import ADMIN_ROLE, SERVICE_ROLE, PLANNER_ROLE, VIEWER_ROLE
21
34
  from cornflow.tests.const import (
22
35
  CASE_PATH,
23
36
  CASE_URL,
@@ -363,15 +376,18 @@ class TestUserEndpoint(TestCase):
363
376
 
364
377
  def test_change_password_rotation(self):
365
378
  current_app.config["PWD_ROTATION_TIME"] = 1 # in days
366
- payload = {"pwd_last_change": (datetime.utcnow() - timedelta(days=2)).strftime("%Y-%m-%dT%H:%M:%SZ")}
367
- self.modify_info(self.planner, self.planner, payload)
379
+ payload = {"pwd_last_change": (datetime.now(timezone.utc) - timedelta(days=2))}
380
+
381
+ planner = UserModel.get_one_user(self.planner["id"])
382
+ planner.update(payload)
383
+
368
384
  response = self.log_in(self.planner)
369
385
  self.assertEqual(True, response.json["change_password"])
370
386
 
371
387
  payload = {"password": "Newtestpassword1!"}
372
388
  self.modify_info(self.planner, self.planner, payload)
373
389
  self.planner.update(payload)
374
- print(self.planner)
390
+
375
391
  response = self.log_in(self.planner)
376
392
  self.assertEqual(False, response.json["change_password"])
377
393
 
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: cornflow
3
- Version: 1.2.0a1
4
- Summary: Cornflow is an open source multi-solver optimization server with a REST API built using flask.
3
+ Version: 1.2.0a3
4
+ Summary: cornflow is an open source multi-solver optimization server with a REST API built using flask.
5
5
  Home-page: https://github.com/baobabsoluciones/cornflow
6
6
  Author: baobab soluciones
7
7
  Author-email: cornflow@baobabsoluciones.es
@@ -12,8 +12,9 @@ Classifier: Development Status :: 5 - Production/Stable
12
12
  Requires-Python: >=3.9
13
13
  Requires-Dist: alembic==1.9.2
14
14
  Requires-Dist: apispec<=6.3.0
15
+ Requires-Dist: cachetools==5.3.3
15
16
  Requires-Dist: click<=8.1.7
16
- Requires-Dist: cornflow-client==1.2.0a1
17
+ Requires-Dist: cornflow-client>=1.2.0
17
18
  Requires-Dist: cryptography<=42.0.5
18
19
  Requires-Dist: disposable-email-domains>=0.0.86
19
20
  Requires-Dist: Flask==2.3.2
@@ -40,7 +41,6 @@ Requires-Dist: requests<=2.32.3
40
41
  Requires-Dist: SQLAlchemy==1.3.21
41
42
  Requires-Dist: webargs<=8.3.0
42
43
  Requires-Dist: Werkzeug==3.0.6
43
- Requires-Dist: cachetools==5.3.3
44
44
  Dynamic: author
45
45
  Dynamic: author-email
46
46
  Dynamic: classifier
@@ -50,7 +50,7 @@ Dynamic: requires-dist
50
50
  Dynamic: requires-python
51
51
  Dynamic: summary
52
52
 
53
- Cornflow
53
+ cornflow
54
54
  =========
55
55
 
56
56
  .. image:: https://github.com/baobabsoluciones/cornflow/workflows/build/badge.svg?style=svg
@@ -70,13 +70,13 @@ Cornflow
70
70
 
71
71
  .. image:: https://img.shields.io/badge/License-Apache2.0-blue
72
72
 
73
- Cornflow is an open source multi-solver optimization server with a REST API built using `flask <https://flask.palletsprojects.com>`_, `airflow <https://airflow.apache.org/>`_ and `pulp <https://coin-or.github.io/pulp/>`_.
73
+ cornflow is an open source multi-solver optimization server with a REST API built using `flask <https://flask.palletsprojects.com>`_, `airflow <https://airflow.apache.org/>`_ and `pulp <https://coin-or.github.io/pulp/>`_.
74
74
 
75
- While most deployment servers are based on the solving technique (MIP, CP, NLP, etc.), Cornflow focuses on the optimization problems themselves. However, it does not impose any constraint on the type of problem and solution method to use.
75
+ While most deployment servers are based on the solving technique (MIP, CP, NLP, etc.), cornflow focuses on the optimization problems themselves. However, it does not impose any constraint on the type of problem and solution method to use.
76
76
 
77
- With Cornflow you can deploy a Traveling Salesman Problem solver next to a Knapsack solver or a Nurse Rostering Problem solver. As long as you describe the input and output data, you can upload any solution method for any problem and then use it with any data you want.
77
+ With cornflow you can deploy a Traveling Salesman Problem solver next to a Knapsack solver or a Nurse Rostering Problem solver. As long as you describe the input and output data, you can upload any solution method for any problem and then use it with any data you want.
78
78
 
79
- Cornflow helps you formalize your problem by proposing development guidelines. It also provides a range of functionalities around your deployed solution method, namely:
79
+ cornflow helps you formalize your problem by proposing development guidelines. It also provides a range of functionalities around your deployed solution method, namely:
80
80
 
81
81
  * storage of users, instances, solutions and solution logs.
82
82
  * deployment and maintenance of models, solvers and algorithms.
@@ -92,9 +92,9 @@ Cornflow helps you formalize your problem by proposing development guidelines. I
92
92
  Installation instructions
93
93
  -------------------------------
94
94
 
95
- Cornflow is tested with Ubuntu 20.04, python >= 3.8 and git.
95
+ cornflow is tested with Ubuntu 20.04, python >= 3.8 and git.
96
96
 
97
- Download the Cornflow project and install requirements::
97
+ Download the cornflow project and install requirements::
98
98
 
99
99
  python3 -m venv venv
100
100
  venv/bin/pip3 install cornflow
@@ -110,7 +110,7 @@ initialize the sqlite database::
110
110
  flask create_admin_user -u cornflow -e cornflow_admin@admin.com -p cornflow_admin_password
111
111
 
112
112
 
113
- activate the virtual environment and run Cornflow::
113
+ activate the virtual environment and run cornflow::
114
114
 
115
115
  source venv/bin/activate
116
116
  export FLASK_APP=cornflow.app
@@ -121,7 +121,7 @@ activate the virtual environment and run Cornflow::
121
121
  export AIRFLOW_PWD=airflow_pwd
122
122
  flask run
123
123
 
124
- **Cornflow needs a running installation of Airflow to operate and more configuration**. Check `the installation docs <https://baobabsoluciones.github.io/cornflow/main/install.html>`_ for more details on installing airflow, configuring the application and initializing the database.
124
+ **cornflow needs a running installation of Airflow to operate and more configuration**. Check `the installation docs <https://baobabsoluciones.github.io/cornflow/main/install.html>`_ for more details on installing airflow, configuring the application and initializing the database.
125
125
 
126
126
  Using cornflow to solve a PuLP model
127
127
  ---------------------------------------
@@ -1,24 +1,24 @@
1
1
  airflow_config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- airflow_config/airflow_local_settings.py,sha256=j4N_HMGyvjwP0abvQQjRamoC5ERA6nSpgvMNdrGgx5k,677
2
+ airflow_config/airflow_local_settings.py,sha256=hsvvO_iv2Qqwo5pEqvll2L4T-obVUxr63TYW2XMGAp4,677
3
3
  airflow_config/webserver_ldap.py,sha256=BjtYGIA35pgmInKeFnG0qC65lfGYq5ZKgZMgdTZ6jXA,2595
4
4
  airflow_config/plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  airflow_config/plugins/XCom/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
6
  airflow_config/plugins/XCom/gce_xcom_backend.py,sha256=vCGvF2jbfZt5bOv-pk5Q_kUR6LomFUojIymimSJmj3o,1795
7
7
  cornflow/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  cornflow/app.py,sha256=-RkH3E_gfVadNOGE9V4TOcqAzTIxNh4zydwv55L5DO0,7526
9
- cornflow/config.py,sha256=aVhoGeU_NqlZlPw0PakgK78Czi2YP6uX620oCXq2S3k,5628
9
+ cornflow/config.py,sha256=c3CNu6wzm5mDJLF6GjrnBKQSNKsRr69S2vQ9jCSAhYw,5628
10
10
  cornflow/gunicorn.py,sha256=uO-Yk7w7nvQSWh12iDxsVvlG-_2BiKIIjm2UiTk4P9E,480
11
11
  cornflow/cli/__init__.py,sha256=5jBmSMpaE1S9rDaQjS8VHJ6x4FfJG8MhKzMzfw7G4Zc,743
12
12
  cornflow/cli/actions.py,sha256=BdTFucT6gZ0QJqo96Zu0C2G9acZ578tLkktKSfTybJ8,414
13
13
  cornflow/cli/arguments.py,sha256=9EEyyny5cJJ1t3WAs6zMgTDvTre0JdQ2N_oZfFQmixs,657
14
14
  cornflow/cli/config.py,sha256=_7Y6tDo5uu4riymkzMYHnTR9IYxBG_FsjwmB84Du90U,1148
15
- cornflow/cli/migrations.py,sha256=Stc8H99rG8vgo3yRJcck11zBY_EA4WqyVybglfl8zJE,1624
15
+ cornflow/cli/migrations.py,sha256=5GuyEsquQZoPW65U7OS_rik6Xe10z16V0So0jDvVYZQ,2334
16
16
  cornflow/cli/permissions.py,sha256=4KXKysH4g8YYQIZcPuXFS2g0xEErp-e8I_FAqMGaV7U,1006
17
17
  cornflow/cli/roles.py,sha256=NFG__qrlyOT0h4L4nwo9FSV4DKjGtMVh3gwiJxwM37w,411
18
18
  cornflow/cli/schemas.py,sha256=sxuJOZf12SBZAXDiAYNPB-n9LSxzSwkB3xyhgS_4K9A,6086
19
- cornflow/cli/service.py,sha256=ProwHlk3s8W5JgESzBDGJ37BOE62N6VZ228zjoiA8kM,9441
19
+ cornflow/cli/service.py,sha256=_LLGespgjf8mnaYDG7Y73TxYCSsphtr5NeFpHItXRS4,9041
20
20
  cornflow/cli/users.py,sha256=nPnu8rQNLtwmeXLwYtJ_hjlsa_24XOnQLgBJRBP9bJw,2104
21
- cornflow/cli/utils.py,sha256=0tF41gTt6LL9XGOizTQg2GXuOXbqLg6gapCr-HWjJ0Q,733
21
+ cornflow/cli/utils.py,sha256=p54xJEnYWda6rqSQDoZU2qZrFu9kTs4FoF0y3pJLQvI,1377
22
22
  cornflow/cli/views.py,sha256=Xyx2l-Sm7panxQEfR3qksCIUoqF7woMKsYgZALkxUXM,636
23
23
  cornflow/cli/tools/__init__.py,sha256=JtyhYfUfirw78BV1mCsdeY0W25fDPWTmZhNBWdDh0wA,19
24
24
  cornflow/cli/tools/api_generator.py,sha256=7ZEEGBdL9Anbj5gnPm3m_eHQm0ehz7Y7YaD952mGh58,16344
@@ -37,9 +37,9 @@ cornflow/commands/roles.py,sha256=Oux-UkswkQ74zqaMEJYIEsZpQZGBcGaSahVzx9feAHU,15
37
37
  cornflow/commands/schemas.py,sha256=QjLXLw5So3f8ZqTg5_uvXxwpo4vE0dMT4_gFMKZHGvQ,1828
38
38
  cornflow/commands/users.py,sha256=MEfqMm2ujso0NQgdUm-crOet-G0M43GNqVCx2Ls-2HY,2591
39
39
  cornflow/commands/views.py,sha256=K2Ld1-l1ZKn9m6e2W1LCxmN44QokwR-8u8rIrviiEf8,2276
40
- cornflow/endpoints/__init__.py,sha256=RI-cNRxYFCuYELPdM0kDDgJhopMMX88HJe-ArTTilNM,7346
40
+ cornflow/endpoints/__init__.py,sha256=ZlwhY8MiynQ0BdATkrsikGM2Kqo4DPxkVTc3faNfzRY,7492
41
41
  cornflow/endpoints/action.py,sha256=ksHK3F919cjkONLcFV2tUIbG-eZw5XbYkqVjYx9iq5I,1359
42
- cornflow/endpoints/alarms.py,sha256=3FN7mosBFP_DcJQxfg1h5_phy755FYESXyQ62XpvFbs,1956
42
+ cornflow/endpoints/alarms.py,sha256=M-fpRAm5ZgYyZXvcgS0NHkeMGnvcbfQh2O5qQJUaeoM,4372
43
43
  cornflow/endpoints/apiview.py,sha256=cpxZFkWy6yrRHiAq2tseyVAK1r8uvjnFuOgJjGT0rKI,1370
44
44
  cornflow/endpoints/case.py,sha256=80Fpv9p8mwIXzjQFuyq1PnPTz3RaOUk932sCUfw7yGA,18670
45
45
  cornflow/endpoints/dag.py,sha256=MRthA2pnZCAFfoPbHCLDW2j1BsQ3WdjRGC17Szl4b28,10390
@@ -49,9 +49,9 @@ cornflow/endpoints/execution.py,sha256=5SWwgbxBUj_gDU6Yb7Z-iKNakr9vr3g5qU82Bw9y5
49
49
  cornflow/endpoints/health.py,sha256=TWmWjKdQOoDzpqwcfksuaAGOLIb2idxzPQcGMWrdkCY,1610
50
50
  cornflow/endpoints/instance.py,sha256=WAnloocXFxSW4vunBJo3CIHx4NzC_0GPJh5bj3ETd9U,11615
51
51
  cornflow/endpoints/licenses.py,sha256=82hHWGYvVIiyw9mlwGtMwJMDJ-ShHOi9rvuM6KvfE4U,873
52
- cornflow/endpoints/login.py,sha256=TeUeBFAeQkpl1FAEfe32BFaaL_pQAR4v_3Gwh-AG0bQ,10199
52
+ cornflow/endpoints/login.py,sha256=ini7w9kFNoVw981UOvlFIaf45rsnpx6nKFnKrM2uDpo,10698
53
53
  cornflow/endpoints/main_alarms.py,sha256=GUB-UdnvEFi7n6FGFKO9VtZeZb4Ox3NvBMhB7rdqNyI,2006
54
- cornflow/endpoints/meta_resource.py,sha256=eqC6U8IpY65Cbk2WpdphRtE6o5kes2lB4LhezfUB7xI,8471
54
+ cornflow/endpoints/meta_resource.py,sha256=XXiNKOs1riFUagy-oj9nOnHo_wqp8atwF3Y5aUzQWCA,8796
55
55
  cornflow/endpoints/permission.py,sha256=FpEBIucfUl89UaJ80SC0VR6pFAdqdSsS43SdNkcXWtI,3751
56
56
  cornflow/endpoints/roles.py,sha256=54ra4MQ9JmrHDsiGczDAVqHgAT4zwhdTA1dLBOy66v8,6105
57
57
  cornflow/endpoints/schemas.py,sha256=lHyvSpPj0x7zVYDlEeRrz_Qqyp6WNimibs5gK4BHpKI,2933
@@ -82,22 +82,22 @@ cornflow/migrations/versions/f3bee20314a2_.py,sha256=pgfAeiPvFvPJXhWlFHq6Y7bjYFG
82
82
  cornflow/models/__init__.py,sha256=hvUe_9Xep1gl8hPKcWxCZN9sORH0Opskj_DnNs3bn24,500
83
83
  cornflow/models/action.py,sha256=8MYzQ2qX5bG0zk28OufypzThkR7AU1J1el-5ABoTurg,1200
84
84
  cornflow/models/alarms.py,sha256=R_g3tkWNSJaAG4gSvthgJlyrueY9VDuIZPoVHk5lDvU,1682
85
- cornflow/models/base_data_model.py,sha256=mVMHJpEoJeH6Wly_ZIfzLfTPd39nSYpCgmtA_ft2VPs,5577
85
+ cornflow/models/base_data_model.py,sha256=AJY_HUW1bTT6bjLeRl21YuKTisriJByr6DevpZOrny4,4472
86
86
  cornflow/models/case.py,sha256=GEs-xeo0bJ5qJETDnIur-2q2IyR3NSj1K0jP3Arz4Xs,9572
87
87
  cornflow/models/dag.py,sha256=DhHpBqJXrLzPoVSyrS_rYI7BotdzITopJDKsql3mQnQ,2930
88
88
  cornflow/models/dag_permissions.py,sha256=QkhPxSLKxH5elIMdf-rnRtV_CEZBQDFFKUOWv15RgwI,1716
89
89
  cornflow/models/execution.py,sha256=9sq_GXSAgFgTpDX3kbJGwsHwNQGXH9E_gfNYIfNtDOk,6022
90
90
  cornflow/models/instance.py,sha256=2E9kBKv1a8soaEAvG8X4qXQ4BVC-IWYD5WQcPmZQw00,3979
91
91
  cornflow/models/main_alarms.py,sha256=9S-Ohr2kYFFWB0HomrpSdDIoUr85Eu1rt90Om_Pa8VY,1748
92
- cornflow/models/meta_models.py,sha256=qeliGdpw0_q0GCeZzansF-09Ay5pueaT-QQPVPZ5aj4,12000
92
+ cornflow/models/meta_models.py,sha256=dW10OCqSPeKsPTHxdEEDM17qW36arPT5pYxIy3vRLKE,12132
93
93
  cornflow/models/permissions.py,sha256=vPHa0A40e18YLzQEzKk9BrqsDQWfguIlsfrSufmW9dY,2804
94
94
  cornflow/models/role.py,sha256=dEASPw8-aLbRRkoyId2zk7lFTq1twpRPMTkwb0zEOIE,2052
95
- cornflow/models/user.py,sha256=podqU5Emhe52ytsUnrBcKShk_jSH_0Em0UXZEAmWgjI,8755
95
+ cornflow/models/user.py,sha256=cv9d10DVAKarcMLTc6PqsmrWzO9ugKrwCvRl5KwllO0,8749
96
96
  cornflow/models/user_role.py,sha256=rr-0S4sV5l6xDQIwd94c3bPepDA50NdStwd3MSzRJbU,4974
97
97
  cornflow/models/view.py,sha256=ajDnvKsm-F1uizk1egaLfZDka3fXF8TXC3zUvkktVIo,2066
98
98
  cornflow/schemas/__init__.py,sha256=ijW3cATETq-SbBCWarRtxLMvU2_oVkaqGbP2gH1KX8o,215
99
99
  cornflow/schemas/action.py,sha256=evR1UGOWH2XqHJ7eQeYGOlTuu2y627w9wDgPaWB86nw,340
100
- cornflow/schemas/alarms.py,sha256=Y-VQ93jbDLtEv49qkNDHwrhwkG7OzEQ0nceqJCqeScQ,541
100
+ cornflow/schemas/alarms.py,sha256=CWqukY4IuOHodgTvOO2cXOZkq1yUdVM4F8RqcPWMu6Q,747
101
101
  cornflow/schemas/case.py,sha256=OXRsDi_sdB47MQJ59S_1eMjDmLlpUtG7kTFNInV2-cI,2909
102
102
  cornflow/schemas/common.py,sha256=QYuxWcOl4smXFZr_vL07OVgH9H50ZywCrXxycVNr1qA,473
103
103
  cornflow/schemas/dag.py,sha256=0ENA75X9L8YqjJW6ZO1Sb4zE8OxB15_O49_nwA6eAVw,901
@@ -109,12 +109,12 @@ cornflow/schemas/main_alarms.py,sha256=cC1_Vb1dmo_vdZpZQrA7jH-hRCjVtLRy6Z2JFBlTr
109
109
  cornflow/schemas/model_json.py,sha256=qUsdd1XmxhcsAmb1JB0xAsvucZoAeQhAQD_3wiY-rVo,202
110
110
  cornflow/schemas/patch.py,sha256=nB6vhmscusfC8tSl4Ded0UwQIbGjGF5_Nwx0kxygKWk,260
111
111
  cornflow/schemas/permissions.py,sha256=dgHKXLDyB1-q-Ii7cuHLpovlFPthtEV3mNxRgTe42ac,1270
112
- cornflow/schemas/query.py,sha256=lQ6lMy0O6RRQLA-9JtQ95p70yd7vra4cGIbLrYO74GE,984
112
+ cornflow/schemas/query.py,sha256=cLgFxJvpmCs7mchHgNbYvKldn3-fGbLtFv3JwuyUfWM,985
113
113
  cornflow/schemas/role.py,sha256=lZYoLpA0weuDiFgpk3PWrHYJdljvZ3HEIOS-ISNLcCg,469
114
114
  cornflow/schemas/schemas.py,sha256=vNyOwrchuTT3TMR9Jj07pauSr2sFTM-rfIfiKUycOjo,433
115
115
  cornflow/schemas/solution_log.py,sha256=jSutvj0-2RJIqzn7ANLFanAD4jrSDvtgqf6DF6UZBhs,2255
116
116
  cornflow/schemas/tables.py,sha256=6uEmG_ddXVPk-itY0aWms568fKroWzv73DtaQ5aeVng,105
117
- cornflow/schemas/user.py,sha256=K1lRrhVCf9GyVAebWs1_O2dLnFJzjZG0bMs_QCTweDk,2245
117
+ cornflow/schemas/user.py,sha256=4zOfAhoBjTrcCQoh5OU_OnL1M7iz9q_Ned2wPi9CjLQ,2201
118
118
  cornflow/schemas/user_role.py,sha256=e5y6RgdZZtLqD-h2B3sa5WokI5-pT78tWw85IG34I74,615
119
119
  cornflow/schemas/view.py,sha256=ctq9Y1TmjrWdyOqgDYeEx7qbbuNLKfSiNOlFTlXmpaw,429
120
120
  cornflow/shared/__init__.py,sha256=1ahcBwWOsSjGI4FEm77JBQjitBdBszOncKcEMjzwGYE,29
@@ -129,13 +129,13 @@ cornflow/shared/utils.py,sha256=g2ZsD3SwsqIHXZ7GWVAVB0F9gX7mT9dQkPgR2Ahsh6M,860
129
129
  cornflow/shared/utils_tables.py,sha256=A7bjpt7Metkb0FP7tKXMqOkak2fgi3O9dejYvoJBpb0,2236
130
130
  cornflow/shared/validators.py,sha256=aFKAAJ2diElUA8WdDyCcXJI6r3FV7HFVzoOTC6t4f8Y,4803
131
131
  cornflow/shared/authentication/__init__.py,sha256=cJIChk5X6hbA_16usEvfHr8g4JDFI6WKo0GPVOOiYHA,137
132
- cornflow/shared/authentication/auth.py,sha256=z7_uAp14psYutBIf5EJKrInQeBw1U4gvBLnullymJLQ,17888
132
+ cornflow/shared/authentication/auth.py,sha256=oCWW3cUxaKYgGi-4--m4sYVBr4T5MzsR_fBQ3bxRIsM,16092
133
133
  cornflow/shared/authentication/decorators.py,sha256=_QpwOU1kYzpaK85Dl0Btdj5hG8Ps47PFgySp_gqhlgk,1276
134
134
  cornflow/shared/authentication/ldap.py,sha256=QfdC2X_ZMcIJabKC5pYWDGMhS5pIOJJvdZXuuiruq-M,4853
135
135
  cornflow/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
136
- cornflow/tests/const.py,sha256=_5BYFGN42Xg0PXMR8UU5DBL6dYmYn5rgRBgPyptrKso,2499
136
+ cornflow/tests/const.py,sha256=x8AfNOHHeU-XWkz3W_wGYidaJ4f6TXokveTR4K4cqfw,2561
137
137
  cornflow/tests/custom_liveServer.py,sha256=I_0YNrcKIwVmRov3zCQMWwcCWkMe5V246Hpa4gS8AZE,3079
138
- cornflow/tests/custom_test_case.py,sha256=3ymIbGFifEB78OhMGUYNhkSj5PN5LlmJ23JsbH5ylEQ,36849
138
+ cornflow/tests/custom_test_case.py,sha256=gW6S0qwNtMWli-5ZCYzUzkjah3QiybKUJcJXrdR3JLw,37919
139
139
  cornflow/tests/integration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
140
140
  cornflow/tests/integration/test_commands.py,sha256=FZcoEM-05D4MBMe0L0V-0sxk_L0zMbzQxb9UCd7iBe0,695
141
141
  cornflow/tests/integration/test_cornflowclient.py,sha256=ioAQmQKWW6mXVJhdF4LECZcGIOa_N0xPkFaGWGtxOO8,20963
@@ -143,34 +143,34 @@ cornflow/tests/ldap/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
143
143
  cornflow/tests/ldap/test_ldap_authentication.py,sha256=6Gu1WkF7MQmcV_10IJkpo2qEloZZ9zjpV18ANDD0HRw,4286
144
144
  cornflow/tests/unit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
145
145
  cornflow/tests/unit/test_actions.py,sha256=plgnzBJnDiZRdVxt1sNJNL2KbW5ijPZ6MHdIUWO0_As,3167
146
- cornflow/tests/unit/test_alarms.py,sha256=GDqCszPgpyEgJ-NZsXWrNid4tzoOywVdPUCYsR_mV5M,2687
147
- cornflow/tests/unit/test_apiview.py,sha256=HHZ--OGDDQLVGTN46BaUcs-7xWSXbMFmacbbhGlQbzQ,3613
146
+ cornflow/tests/unit/test_alarms.py,sha256=PCOibHct8UG1jr014e_s_gJu_VyTxdC1AeqKeuQ2vLs,4556
147
+ cornflow/tests/unit/test_apiview.py,sha256=03M1GsQRVK7zqmslhOJXr4lLDLY2gMAgg86nk1lyaKU,7620
148
148
  cornflow/tests/unit/test_application.py,sha256=ZVmTQDUOkPRxHqt6mWU9G_lQ3jJNMJR0cx7IkLMFGrU,1715
149
149
  cornflow/tests/unit/test_cases.py,sha256=1EvabDK08K0CovXvReLCfXiO6n_MXdNcwuCrGPbTVw8,37708
150
- cornflow/tests/unit/test_cli.py,sha256=0l1_fYvJg-f_wA1SFgtMTzdBRy6uLhp58xWkNIR-tXQ,18602
150
+ cornflow/tests/unit/test_cli.py,sha256=E2w-Lzgx_k__0mYwlbg2z80_z9nwPZKI0CbgyGmpQRY,18775
151
151
  cornflow/tests/unit/test_commands.py,sha256=kvO8Vn60rj3WBG2oXw7NpDSEYoGLNe806txbJPhtNJo,14722
152
- cornflow/tests/unit/test_dags.py,sha256=DR4YK7DNpifQFa4kcB0rlrPcqhllvYWjj7XsTd7DkgI,13401
152
+ cornflow/tests/unit/test_dags.py,sha256=XsOi5bBJQdQz3DmYAVJf1myoAsRyBBdmku-xBr0Bku0,13386
153
153
  cornflow/tests/unit/test_data_checks.py,sha256=6s50d1iuRTUcAYn14oEcRS39ZZ6E9ussU4YpkpYhtC4,8612
154
154
  cornflow/tests/unit/test_example_data.py,sha256=D-Tgnqw7NZlnBXaDcUU0reNhAca5JlJP2Sdn3KdS4Sw,4127
155
155
  cornflow/tests/unit/test_executions.py,sha256=_hIaiZri7Blyx4DYhBDHh-0peU1HQh66RSPqQJFveE8,17501
156
156
  cornflow/tests/unit/test_generate_from_schema.py,sha256=L1EdnASbDJ8SjrX1V4WnUKKwV0sRTwVnNYnxSpyeSeQ,15376
157
157
  cornflow/tests/unit/test_health.py,sha256=0E0HXMb63_Z8drbLZdxnJwtTbQyaZS9ZEHut6qsDbh8,1033
158
- cornflow/tests/unit/test_instances.py,sha256=ovcKfykuyx7IoOL-aetFLfJ1lpbTSxUDf2kKMuB-WMY,10573
158
+ cornflow/tests/unit/test_instances.py,sha256=Mf9jijQOcDE3ylPfMTnVRocRegcugEdCnoMCqSmKKqQ,11083
159
159
  cornflow/tests/unit/test_instances_file.py,sha256=sbodxnuoT7n7jdELz-wpVXWt76E5UzUrQYyVpvnfbco,1986
160
160
  cornflow/tests/unit/test_licenses.py,sha256=oj1YdqdxzEdRtxyQiFmRyXyvLzNbl6BeiGCCZH_Y42c,1534
161
- cornflow/tests/unit/test_log_in.py,sha256=fI3JK7vrxSZkun027YUM3geSAcWYLRu_vXJ0Rubgnf0,18077
161
+ cornflow/tests/unit/test_log_in.py,sha256=Wi9bpHC7TsJ4BcjBUL-YGXfS5ZrqmA2bCnhnwyRVEFc,18107
162
162
  cornflow/tests/unit/test_main_alarms.py,sha256=y--A4Ap2X38TCCRgbimzaZ-QvnTqZY8KHCv7C8kTTwc,2060
163
163
  cornflow/tests/unit/test_permissions.py,sha256=Jd-4PtqBcWGrSZAuTlJD82qE65D9ZtGWBM6sJY1f_yA,8782
164
- cornflow/tests/unit/test_roles.py,sha256=qY6vtVyIKAAfrdYMYwUJL2OS3plredfzT5loKjUF9p0,16584
164
+ cornflow/tests/unit/test_roles.py,sha256=1-EON_JsPAM3sVL8AUfgJYLLfb0s1FXL8LJS4nilF-g,18166
165
165
  cornflow/tests/unit/test_schema_from_models.py,sha256=7IfycOGO3U06baX8I-OPJfu-3ZAn5cv8RCdj9wvalMk,4421
166
166
  cornflow/tests/unit/test_schemas.py,sha256=6SpkeYsS3oWntUZEF3GldLqmNa-hpxg-WrKJVTgc-B4,7468
167
167
  cornflow/tests/unit/test_sign_up.py,sha256=-i6VO9z1FwqRHFvaSrpWAzOZx6qa8mHUEmmsjuMXjn8,3481
168
168
  cornflow/tests/unit/test_tables.py,sha256=7lZsdun8_SWvYO-6ezQeuTxRat_fyP9vCfXoU7zvHBU,8947
169
- cornflow/tests/unit/test_token.py,sha256=n-QA6bFNKMVR4tsuUiso6Gq_CZ_NuTXLetoJzDOzYhc,3982
170
- cornflow/tests/unit/test_users.py,sha256=WfaMcybPpR7rspXyvzHGgw25p751hMPAV0DOp_caSPM,22430
169
+ cornflow/tests/unit/test_token.py,sha256=PZ11b46UCQpCESsRiAPhpgWkGAsAwKCVNxVQai_kxXM,4199
170
+ cornflow/tests/unit/test_users.py,sha256=N5tcF5nSncD0F_ZlBxGuS87p6kNS4hUzRLr3_AcnK-o,22802
171
171
  cornflow/tests/unit/tools.py,sha256=ag3sWv2WLi498R1GL5AOUnXqSsszD3UugzLZLC5NqAw,585
172
- cornflow-1.2.0a1.dist-info/METADATA,sha256=qbyhVR1FExIEv78HbSs4AQ_l05qUW5TNE-cl-sznBdw,9531
173
- cornflow-1.2.0a1.dist-info/WHEEL,sha256=nn6H5-ilmfVryoAQl3ZQ2l8SH5imPWFpm1A5FgEuFV4,91
174
- cornflow-1.2.0a1.dist-info/entry_points.txt,sha256=q9cPKAFBsmHkERCqQ2JcOTM-tVBLHTl-DGxwCXowAWM,46
175
- cornflow-1.2.0a1.dist-info/top_level.txt,sha256=Qj9kLFJW1PLb-ZV2s_aCkQ-Wi5W6KC6fFR-LTBrx-rU,24
176
- cornflow-1.2.0a1.dist-info/RECORD,,
172
+ cornflow-1.2.0a3.dist-info/METADATA,sha256=nJIES975tkRkp0uJk6Ziwd0qeFHssPq865VEfBvcHP8,9529
173
+ cornflow-1.2.0a3.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
174
+ cornflow-1.2.0a3.dist-info/entry_points.txt,sha256=q9cPKAFBsmHkERCqQ2JcOTM-tVBLHTl-DGxwCXowAWM,46
175
+ cornflow-1.2.0a3.dist-info/top_level.txt,sha256=Qj9kLFJW1PLb-ZV2s_aCkQ-Wi5W6KC6fFR-LTBrx-rU,24
176
+ cornflow-1.2.0a3.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.1)
2
+ Generator: setuptools (76.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5