cornflow 1.2.0a1__py3-none-any.whl → 1.2.0a2__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.
- airflow_config/airflow_local_settings.py +1 -1
- cornflow/cli/migrations.py +23 -3
- cornflow/cli/service.py +3 -9
- cornflow/cli/utils.py +16 -1
- cornflow/config.py +1 -1
- cornflow/endpoints/__init__.py +7 -1
- cornflow/endpoints/alarms.py +66 -2
- cornflow/endpoints/login.py +59 -38
- cornflow/endpoints/meta_resource.py +11 -3
- cornflow/models/base_data_model.py +4 -32
- cornflow/models/meta_models.py +28 -22
- cornflow/models/user.py +7 -10
- cornflow/schemas/alarms.py +8 -0
- cornflow/schemas/query.py +2 -1
- cornflow/schemas/user.py +2 -3
- cornflow/shared/authentication/auth.py +19 -39
- cornflow/tests/const.py +1 -0
- cornflow/tests/custom_test_case.py +42 -12
- cornflow/tests/unit/test_alarms.py +55 -1
- cornflow/tests/unit/test_apiview.py +106 -1
- cornflow/tests/unit/test_cli.py +6 -5
- cornflow/tests/unit/test_dags.py +0 -1
- cornflow/tests/unit/test_instances.py +12 -0
- cornflow/tests/unit/test_log_in.py +8 -5
- cornflow/tests/unit/test_roles.py +38 -0
- cornflow/tests/unit/test_token.py +11 -3
- cornflow/tests/unit/test_users.py +22 -6
- {cornflow-1.2.0a1.dist-info → cornflow-1.2.0a2.dist-info}/METADATA +13 -13
- {cornflow-1.2.0a1.dist-info → cornflow-1.2.0a2.dist-info}/RECORD +32 -32
- {cornflow-1.2.0a1.dist-info → cornflow-1.2.0a2.dist-info}/WHEEL +1 -1
- {cornflow-1.2.0a1.dist-info → cornflow-1.2.0a2.dist-info}/entry_points.txt +0 -0
- {cornflow-1.2.0a1.dist-info → cornflow-1.2.0a2.dist-info}/top_level.txt +0 -0
@@ -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 = {"
|
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 = {"
|
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": "
|
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 = {
|
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 = {"
|
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
|
-
|
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
|
-
|
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.
|
367
|
-
|
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
|
-
|
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.
|
4
|
-
Summary:
|
3
|
+
Version: 1.2.0a2
|
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
|
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
|
-
|
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
|
-
|
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.),
|
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
|
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
|
-
|
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
|
-
|
95
|
+
cornflow is tested with Ubuntu 20.04, python >= 3.8 and git.
|
96
96
|
|
97
|
-
Download the
|
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
|
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
|
-
**
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
40
|
+
cornflow/endpoints/__init__.py,sha256=ZlwhY8MiynQ0BdATkrsikGM2Kqo4DPxkVTc3faNfzRY,7492
|
41
41
|
cornflow/endpoints/action.py,sha256=ksHK3F919cjkONLcFV2tUIbG-eZw5XbYkqVjYx9iq5I,1359
|
42
|
-
cornflow/endpoints/alarms.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
147
|
-
cornflow/tests/unit/test_apiview.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
170
|
-
cornflow/tests/unit/test_users.py,sha256=
|
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.
|
173
|
-
cornflow-1.2.
|
174
|
-
cornflow-1.2.
|
175
|
-
cornflow-1.2.
|
176
|
-
cornflow-1.2.
|
172
|
+
cornflow-1.2.0a2.dist-info/METADATA,sha256=4wu2LjVfPzw_7FPRELrUxX3zu7MfNixMw6RnFqYLiDE,9529
|
173
|
+
cornflow-1.2.0a2.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
|
174
|
+
cornflow-1.2.0a2.dist-info/entry_points.txt,sha256=q9cPKAFBsmHkERCqQ2JcOTM-tVBLHTl-DGxwCXowAWM,46
|
175
|
+
cornflow-1.2.0a2.dist-info/top_level.txt,sha256=Qj9kLFJW1PLb-ZV2s_aCkQ-Wi5W6KC6fFR-LTBrx-rU,24
|
176
|
+
cornflow-1.2.0a2.dist-info/RECORD,,
|
File without changes
|
File without changes
|