cornflow 1.2.4__py3-none-any.whl → 1.3.0rc1__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.
Files changed (47) hide show
  1. cornflow/cli/service.py +91 -42
  2. cornflow/commands/dag.py +7 -7
  3. cornflow/commands/permissions.py +9 -5
  4. cornflow/config.py +23 -3
  5. cornflow/endpoints/case.py +37 -21
  6. cornflow/endpoints/dag.py +5 -5
  7. cornflow/endpoints/data_check.py +8 -7
  8. cornflow/endpoints/example_data.py +4 -2
  9. cornflow/endpoints/execution.py +215 -127
  10. cornflow/endpoints/health.py +30 -11
  11. cornflow/endpoints/instance.py +3 -3
  12. cornflow/endpoints/login.py +9 -2
  13. cornflow/endpoints/schemas.py +3 -3
  14. cornflow/migrations/versions/999b98e24225.py +34 -0
  15. cornflow/migrations/versions/cef1df240b27_.py +34 -0
  16. cornflow/models/__init__.py +2 -1
  17. cornflow/models/dag.py +8 -9
  18. cornflow/models/dag_permissions.py +3 -3
  19. cornflow/models/execution.py +2 -3
  20. cornflow/models/permissions.py +1 -0
  21. cornflow/models/user.py +1 -1
  22. cornflow/schemas/execution.py +14 -1
  23. cornflow/schemas/health.py +1 -1
  24. cornflow/shared/authentication/auth.py +14 -1
  25. cornflow/shared/authentication/decorators.py +0 -1
  26. cornflow/shared/const.py +44 -1
  27. cornflow/shared/exceptions.py +2 -1
  28. cornflow/tests/base_test_execution.py +798 -0
  29. cornflow/tests/const.py +1 -0
  30. cornflow/tests/integration/test_commands.py +2 -2
  31. cornflow/tests/integration/test_cornflowclient.py +2 -1
  32. cornflow/tests/unit/test_cases.py +1 -1
  33. cornflow/tests/unit/test_commands.py +5 -5
  34. cornflow/tests/unit/test_dags.py +3 -3
  35. cornflow/tests/unit/test_example_data.py +1 -1
  36. cornflow/tests/unit/test_executions.py +115 -535
  37. cornflow/tests/unit/test_health.py +84 -3
  38. cornflow/tests/unit/test_main_alarms.py +1 -1
  39. cornflow/tests/unit/test_roles.py +2 -1
  40. cornflow/tests/unit/test_schema_from_models.py +1 -1
  41. cornflow/tests/unit/test_schemas.py +1 -1
  42. cornflow/tests/unit/tools.py +93 -10
  43. {cornflow-1.2.4.dist-info → cornflow-1.3.0rc1.dist-info}/METADATA +2 -2
  44. {cornflow-1.2.4.dist-info → cornflow-1.3.0rc1.dist-info}/RECORD +47 -44
  45. {cornflow-1.2.4.dist-info → cornflow-1.3.0rc1.dist-info}/WHEEL +0 -0
  46. {cornflow-1.2.4.dist-info → cornflow-1.3.0rc1.dist-info}/entry_points.txt +0 -0
  47. {cornflow-1.2.4.dist-info → cornflow-1.3.0rc1.dist-info}/top_level.txt +0 -0
@@ -1,10 +1,18 @@
1
1
  import os
2
+ from unittest.mock import patch, MagicMock
2
3
 
3
4
  from cornflow.shared import db
4
5
 
5
6
  from cornflow.app import create_app
6
7
  from cornflow.commands import access_init_command
7
- from cornflow.shared.const import STATUS_HEALTHY, CORNFLOW_VERSION
8
+ from cornflow.shared.const import (
9
+ STATUS_HEALTHY,
10
+ STATUS_UNHEALTHY,
11
+ CORNFLOW_VERSION,
12
+ DATABRICKS_BACKEND,
13
+ AIRFLOW_BACKEND,
14
+ )
15
+ from cornflow.shared.exceptions import EndpointNotImplemented
8
16
  from cornflow.tests.const import HEALTH_URL
9
17
  from cornflow.tests.custom_test_case import CustomTestCase
10
18
 
@@ -28,10 +36,83 @@ class TestHealth(CustomTestCase):
28
36
  response = self.client.get(HEALTH_URL)
29
37
  self.assertEqual(200, response.status_code)
30
38
  cf_status = response.json["cornflow_status"]
31
- af_status = response.json["airflow_status"]
39
+ backend_status = response.json["backend_status"]
32
40
  cf_version = response.json["cornflow_version"]
33
41
  expected_version = CORNFLOW_VERSION
34
42
  self.assertEqual(str, type(cf_status))
35
- self.assertEqual(str, type(af_status))
43
+ self.assertEqual(str, type(backend_status))
36
44
  self.assertEqual(cf_status, STATUS_HEALTHY)
37
45
  self.assertEqual(cf_version, expected_version)
46
+
47
+ @patch("cornflow.endpoints.health.Databricks")
48
+ def test_health_databricks_backend_healthy(self, mock_databricks):
49
+ """Test health endpoint with Databricks backend when service is healthy"""
50
+ self.create_service_user()
51
+ os.environ["CORNFLOW_SERVICE_USER"] = "testuser4"
52
+
53
+ # Mock Databricks client
54
+ mock_db_client = MagicMock()
55
+ mock_db_client.is_alive.return_value = True
56
+ mock_databricks.from_config.return_value = mock_db_client
57
+
58
+ # Set Databricks backend
59
+ with self.app.app_context():
60
+ self.app.config["CORNFLOW_BACKEND"] = DATABRICKS_BACKEND
61
+
62
+ response = self.client.get(HEALTH_URL)
63
+
64
+ self.assertEqual(200, response.status_code)
65
+ cf_status = response.json["cornflow_status"]
66
+ backend_status = response.json["backend_status"]
67
+ cf_version = response.json["cornflow_version"]
68
+
69
+ self.assertEqual(cf_status, STATUS_HEALTHY)
70
+ self.assertEqual(backend_status, STATUS_HEALTHY)
71
+ self.assertEqual(cf_version, CORNFLOW_VERSION)
72
+
73
+ # Verify Databricks client was called
74
+ mock_databricks.from_config.assert_called_once()
75
+ mock_db_client.is_alive.assert_called_once()
76
+
77
+ @patch("cornflow.endpoints.health.Databricks")
78
+ def test_health_databricks_backend_unhealthy(self, mock_databricks):
79
+ """Test health endpoint with Databricks backend when service is unhealthy"""
80
+ self.create_service_user()
81
+ os.environ["CORNFLOW_SERVICE_USER"] = "testuser4"
82
+
83
+ # Mock Databricks client
84
+ mock_db_client = MagicMock()
85
+ mock_db_client.is_alive.return_value = False
86
+ mock_databricks.from_config.return_value = mock_db_client
87
+
88
+ # Set Databricks backend
89
+ with self.app.app_context():
90
+ self.app.config["CORNFLOW_BACKEND"] = DATABRICKS_BACKEND
91
+
92
+ response = self.client.get(HEALTH_URL)
93
+
94
+ self.assertEqual(200, response.status_code)
95
+ cf_status = response.json["cornflow_status"]
96
+ backend_status = response.json["backend_status"]
97
+
98
+ self.assertEqual(cf_status, STATUS_HEALTHY)
99
+ self.assertEqual(backend_status, STATUS_UNHEALTHY)
100
+
101
+ # Verify Databricks client was called
102
+ mock_databricks.from_config.assert_called_once()
103
+ mock_db_client.is_alive.assert_called_once()
104
+
105
+ def test_health_unsupported_backend(self):
106
+ """Test health endpoint with unsupported backend raises EndpointNotImplemented"""
107
+ self.create_service_user()
108
+ os.environ["CORNFLOW_SERVICE_USER"] = "testuser4"
109
+
110
+ # Set an unsupported backend value
111
+ with self.app.app_context():
112
+ self.app.config["CORNFLOW_BACKEND"] = 999 # Invalid backend value
113
+
114
+ response = self.client.get(HEALTH_URL)
115
+
116
+ self.assertEqual(501, response.status_code)
117
+ self.assertIn("error", response.json)
118
+ self.assertEqual(response.json["error"], "Endpoint not implemented")
@@ -5,7 +5,7 @@
5
5
  import json
6
6
 
7
7
  # Imports from internal modules
8
- from cornflow.models import MainAlarmsModel, AlarmsModel
8
+ from cornflow.models import MainAlarmsModel
9
9
  from cornflow.tests.const import MAIN_ALARMS_URL, ALARMS_URL
10
10
  from cornflow.tests.custom_test_case import CustomTestCase
11
11
 
@@ -251,7 +251,8 @@ class TestUserRolesListEndpoint(CustomTestCase):
251
251
  },
252
252
  )
253
253
  self.assertEqual(200, response.status_code)
254
- self.assertEqual(self.payload, response.json)
254
+ self.assertCountEqual(self.payload, response.json)
255
+
255
256
 
256
257
  def test_get_user_roles_not_authorized_user(self):
257
258
  for role in ROLES_MAP:
@@ -81,7 +81,7 @@
81
81
  # }
82
82
  # required_instance = {"id", "name", "data_hash"}
83
83
  # foreign_keys = [
84
- # ("permission_dag", "dag_id", "deployed_dags.id"),
84
+ # ("permission_dag", "dag_id", "deployed_workflows.id"),
85
85
  # ("permission_dag", "user_id", "users.id"),
86
86
  # ("permission_view", "action_id", "actions.id"),
87
87
  # ("permission_view", "api_view_id", "api_view.id"),
@@ -189,7 +189,7 @@ class TestNewSchemaEndpointOpen(CustomTestCase):
189
189
 
190
190
  def test_get_all_schemas(self):
191
191
  schemas = self.get_one_row(self.url, {}, 200, False, keys_to_check=["name"])
192
- dags = [{"name": dag} for dag in ["solve_model_dag", "gc", "timer"]]
192
+ dags = [{"name": dag} for dag in ["solve_model_dag", "gc", "timer", "979073949072767"]]
193
193
 
194
194
  self.assertEqual(dags, schemas)
195
195
 
@@ -1,13 +1,96 @@
1
- from unittest.mock import Mock
1
+ from unittest.mock import Mock, patch
2
+ from flask import Flask
3
+ import json
4
+ import os
5
+
6
+ from cornflow.shared.const import (
7
+ DATABRICKS_TERMINATE_STATE,
8
+ DATABRICKS_FINISH_TO_STATE_MAP,
9
+ )
10
+
11
+
12
+ def create_test_app():
13
+ app = Flask(__name__)
14
+ app.config["CORNFLOW_BACKEND"] = 2
15
+ return app
2
16
 
3
17
 
4
18
  def patch_af_client(af_client_class):
5
- af_client_mock = Mock()
6
- responses_mock = Mock()
7
- responses_mock.json.return_value = {"is_paused": False, "dag_run_id": "12345", "state": "success"}
8
- af_client_mock.is_alive.return_value = True
9
- af_client_mock.get_dag_info.return_value = responses_mock
10
- af_client_mock.run_dag.return_value = responses_mock
11
- af_client_mock.get_dag_run_status.return_value = responses_mock
12
- af_client_mock.set_dag_run_to_fail.return_value = None
13
- af_client_class.from_config.return_value = af_client_mock
19
+ with patch("cornflow.endpoints.execution.current_app.config") as mock_config:
20
+ mock_config.__getitem__.side_effect = lambda key: (
21
+ 1 if key == "CORNFLOW_BACKEND" else {}
22
+ )
23
+ af_client_mock = Mock()
24
+ responses_mock = Mock()
25
+ responses_mock.json.return_value = {
26
+ "is_paused": False,
27
+ "dag_run_id": "12345",
28
+ "state": "success",
29
+ }
30
+ af_client_mock.is_alive.return_value = True
31
+ af_client_mock.get_workflow_info.return_value = responses_mock
32
+
33
+ # Configurar get_workflow_info
34
+ schema_info_mock = Mock()
35
+ schema_info_mock.json.return_value = {"is_paused": False}
36
+ af_client_mock.get_workflow_info.return_value = schema_info_mock
37
+
38
+ # Configurar run_workflow
39
+ run_response_mock = Mock()
40
+ run_response_mock.json.return_value = {"dag_run_id": "12345"}
41
+ af_client_mock.run_workflow.return_value = run_response_mock
42
+
43
+ # Configurar get_run_status
44
+ status_mock = Mock()
45
+ status_mock.json.return_value = {"state": "success"}
46
+ af_client_mock.get_run_status.return_value = status_mock
47
+
48
+ af_client_mock.run_dag.return_value = responses_mock
49
+ af_client_mock.set_dag_run_to_fail.return_value = None
50
+ af_client_class.from_config.return_value = af_client_mock
51
+
52
+
53
+ def patch_db_client(db_client_class):
54
+ mock_config = {"CORNFLOW_BACKEND": 2}
55
+
56
+ with patch("cornflow.endpoints.execution.current_app.config", mock_config):
57
+ db_client_mock = Mock()
58
+ responses_mock = Mock()
59
+ responses_mock.json.return_value = {
60
+ "status": {"state": "SUCCESS", "termination_details": {"code": "SUCCESS"}}
61
+ }
62
+ response_run_workflow = Mock()
63
+ response_run_workflow.json.return_value = {
64
+ "run_id": 350148078719367,
65
+ "number_in_job": 350148078719367,
66
+ }
67
+ response_get_workflow_info = Mock()
68
+ current_dir = os.path.dirname(os.path.abspath(__file__))
69
+ test_data_dir = os.path.join(os.path.dirname(current_dir), "data")
70
+ with open(
71
+ os.path.join(test_data_dir, "patch_databricks_get_orch_info.json")
72
+ ) as f:
73
+ response_get_workflow_info.json.return_value = json.load(f)
74
+ response_get_run_status = Mock()
75
+ with open(
76
+ os.path.join(test_data_dir, "patch_databricks_get_run_status.json")
77
+ ) as f:
78
+ response_get_run_status.json.return_value = json.load(f)
79
+ state = response_get_run_status.json.return_value["status"]["state"]
80
+ if state == DATABRICKS_TERMINATE_STATE:
81
+ if (
82
+ response_get_run_status.json.return_value["status"][
83
+ "termination_details"
84
+ ]["code"]
85
+ in DATABRICKS_FINISH_TO_STATE_MAP.keys()
86
+ ):
87
+ response_get_run_status = response_get_run_status.json.return_value[
88
+ "status"
89
+ ]["termination_details"]["code"]
90
+ else:
91
+ response_get_run_status = "OTHER_FINISH_ERROR"
92
+ db_client_mock.is_alive.return_value = True
93
+ db_client_mock.get_workflow_info.return_value = response_get_workflow_info
94
+ db_client_mock.run_workflow.return_value = response_run_workflow
95
+ db_client_mock.get_run_status.return_value = response_get_run_status
96
+ db_client_class.from_config.return_value = db_client_mock
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cornflow
3
- Version: 1.2.4
3
+ Version: 1.3.0rc1
4
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
@@ -14,7 +14,7 @@ Requires-Dist: alembic==1.9.2
14
14
  Requires-Dist: apispec<=6.3.0
15
15
  Requires-Dist: cachetools==5.3.3
16
16
  Requires-Dist: click<=8.1.7
17
- Requires-Dist: cornflow-client<=1.2.4
17
+ Requires-Dist: cornflow-client==1.3.0rc1
18
18
  Requires-Dist: cryptography<=44.0.1
19
19
  Requires-Dist: disposable-email-domains>=0.0.86
20
20
  Requires-Dist: Flask==2.3.2
@@ -6,7 +6,7 @@ airflow_config/plugins/XCom/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMp
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=Jov5TS85r_dKYqZ1tZ34JxavoHJbfBt0DdyDxh2V2tI,8008
9
- cornflow/config.py,sha256=kOfQRJIUGfNlRhNu5bHEIFO9qEzTQAS3LtuAntt_Wmc,5725
9
+ cornflow/config.py,sha256=AVk10gmw_n_R36LVu2TLRA8Au2Qm2nm_Kd3NuARh7bE,6521
10
10
  cornflow/gunicorn.py,sha256=uO-Yk7w7nvQSWh12iDxsVvlG-_2BiKIIjm2UiTk4P9E,480
11
11
  cornflow/cli/__init__.py,sha256=2QfFLxLcX5zYt3Ok3QKNWQvUvAeEnLsH7xiGN3GjwFU,853
12
12
  cornflow/cli/actions.py,sha256=-vm7hUrRTtJA6y0ZK2cIeTKFQi8Wl2Z6ico2px9Fiuk,524
@@ -16,7 +16,7 @@ cornflow/cli/migrations.py,sha256=nJbmulqwFxuaSPmo9hJiTl1pUSojeXfAdd9aGM_g9ic,24
16
16
  cornflow/cli/permissions.py,sha256=fyIp5M0ZpJWVf_tGZG0DN0Gnk1geruadkdKK11cmRk8,1116
17
17
  cornflow/cli/roles.py,sha256=1dvAq1Bp1iEAUUfXFeL8kYjI0ZchYlDwIBQpTtwV6vs,529
18
18
  cornflow/cli/schemas.py,sha256=s9IUJWa2G0kpqJaN6PcwbwZtGChTaqq451QqWEyWPBI,6197
19
- cornflow/cli/service.py,sha256=69n4RT0-AApzz0jslbPttZVmG_uxwhLm1gAqQvRH3ec,13340
19
+ cornflow/cli/service.py,sha256=tpITdvfRxzGfpJn09VuvD7jbOxcEj6iBH4iPdm1mzS4,15949
20
20
  cornflow/cli/users.py,sha256=VBUqOrS80qdp9E4XLn4ihocHVNWVhWSt19tp0o8mZII,2324
21
21
  cornflow/cli/utils.py,sha256=p54xJEnYWda6rqSQDoZU2qZrFu9kTs4FoF0y3pJLQvI,1377
22
22
  cornflow/cli/views.py,sha256=BjJRIQ5T3C8zl3-pVVkToVjQ6xdAGwnuT9LVEnn_jqM,746
@@ -32,8 +32,8 @@ cornflow/commands/access.py,sha256=4as74PKwcq5VoPnT9Hh2uUEDQLOQo6jAelwmeBIPW3c,1
32
32
  cornflow/commands/actions.py,sha256=4AwgAmyI6VeaugkISvTlNGrIzMMU_-ZB3MhwDD_CIEA,1544
33
33
  cornflow/commands/auxiliar.py,sha256=rM_PENCXDKbPSpE5TCvsDFE3riwDwwQiFg019Qms7OU,3764
34
34
  cornflow/commands/cleanup.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
- cornflow/commands/dag.py,sha256=AtagFGnB_ucfO0qUawDgd4iRoBCVc-RiOs08DqXSwXM,3786
36
- cornflow/commands/permissions.py,sha256=x50jd2HbzVUDZ17bZKkDeDlLeWmFXXqsY9ocFnqDOf0,10544
35
+ cornflow/commands/dag.py,sha256=VusWUxYg_q_dMpKY_pN6o06_Mql8d379dIL3zXlJyxY,3835
36
+ cornflow/commands/permissions.py,sha256=9XRhd914hZp41Wb7PiXjjrr-BWtiXen7yJCTJ4Ku4W0,10654
37
37
  cornflow/commands/roles.py,sha256=MHMn-nNSgvRww5RNblxXvdG9BBCtMvPtc-KD5EMwseg,1605
38
38
  cornflow/commands/schemas.py,sha256=40dZSJ2nEqBa7Crb6DbFmnclT5e8ljAIjscOgHr9lhk,1970
39
39
  cornflow/commands/users.py,sha256=2YTbNYY5kZL6ujxGP4fyYgqtv5uuVGdkLR31n7OFFaE,2477
@@ -42,20 +42,20 @@ cornflow/endpoints/__init__.py,sha256=NNKkdqA7NnvqsqiFhEY1ZQ0NRIoAliHJ-Hdf9SottN
42
42
  cornflow/endpoints/action.py,sha256=ksHK3F919cjkONLcFV2tUIbG-eZw5XbYkqVjYx9iq5I,1359
43
43
  cornflow/endpoints/alarms.py,sha256=M-fpRAm5ZgYyZXvcgS0NHkeMGnvcbfQh2O5qQJUaeoM,4372
44
44
  cornflow/endpoints/apiview.py,sha256=cpxZFkWy6yrRHiAq2tseyVAK1r8uvjnFuOgJjGT0rKI,1370
45
- cornflow/endpoints/case.py,sha256=80Fpv9p8mwIXzjQFuyq1PnPTz3RaOUk932sCUfw7yGA,18670
46
- cornflow/endpoints/dag.py,sha256=fWDLfo42mtARZBzXqDrK5JMiIOyrEkYGh4GzKYJLGWk,10087
47
- cornflow/endpoints/data_check.py,sha256=6G2XIoyYn0Xh5Fx6rQIgrtiv6M6_xpxHcdVTNi-n4ug,13532
48
- cornflow/endpoints/example_data.py,sha256=DiZ7gSilX8XqgJVm4RN5Xto6fWCaMMx12kenfw8pJD0,4427
49
- cornflow/endpoints/execution.py,sha256=MjiAan8vLcuWh6l4BO1l9rB_uDbEd4EwowN8XFR7z70,27890
50
- cornflow/endpoints/health.py,sha256=l7Xoh5GiqOJv1CiSKkFikUGnNP1NRAD-2xHzeg3Qyjo,1708
51
- cornflow/endpoints/instance.py,sha256=KRWXmh5FaCPe-xalbl7fTlb1WUNrEMLSCpK791Dg1eM,12740
45
+ cornflow/endpoints/case.py,sha256=Wb5BxMhITrpBSR5aTLsVHLFFB_noHBXkPg62nPSAvsM,18777
46
+ cornflow/endpoints/dag.py,sha256=m8ymKjftGCToEBYmRp1MFJWrgKvXlovYsD0k3mgUCqA,10112
47
+ cornflow/endpoints/data_check.py,sha256=G19KaEnR83s8nUZVorKzucadlfBBlSikiMHmmHrwl-k,13589
48
+ cornflow/endpoints/example_data.py,sha256=TXsYZFF9vycpXxQNP2-YsVaAyeeGyWaei-i7oozV3SU,4509
49
+ cornflow/endpoints/execution.py,sha256=nWd2TaZaI99ETpa1oiFzJC-d-l_uHuOlSACouzFgywk,31559
50
+ cornflow/endpoints/health.py,sha256=AuEqNiITm9pJhs3XYH5vJj3fMnapPktC1YV9ays7uVM,2258
51
+ cornflow/endpoints/instance.py,sha256=1ZvSeNBo9SRnT-yFHSs2nhRVZmihxIWJf3i2K3NM7Hw,12755
52
52
  cornflow/endpoints/licenses.py,sha256=82hHWGYvVIiyw9mlwGtMwJMDJ-ShHOi9rvuM6KvfE4U,873
53
- cornflow/endpoints/login.py,sha256=ini7w9kFNoVw981UOvlFIaf45rsnpx6nKFnKrM2uDpo,10698
53
+ cornflow/endpoints/login.py,sha256=c7SjVvUlUPX1BLCZNYmCGC7bMBsvY_JVkpqmLLF3bxo,11006
54
54
  cornflow/endpoints/main_alarms.py,sha256=GUB-UdnvEFi7n6FGFKO9VtZeZb4Ox3NvBMhB7rdqNyI,2006
55
55
  cornflow/endpoints/meta_resource.py,sha256=hqzOgmYFAzGsXVo0BIb5rjS71uNKVMuyLi-QkAQnb34,8639
56
56
  cornflow/endpoints/permission.py,sha256=qG-NTA1AdkGuGNb3Aqq2PkPT84nj6W1ym9gLQixVOnA,3751
57
57
  cornflow/endpoints/roles.py,sha256=54ra4MQ9JmrHDsiGczDAVqHgAT4zwhdTA1dLBOy66v8,6105
58
- cornflow/endpoints/schemas.py,sha256=lHyvSpPj0x7zVYDlEeRrz_Qqyp6WNimibs5gK4BHpKI,2933
58
+ cornflow/endpoints/schemas.py,sha256=V_QrCCYIkX8lU2fJpG37vVwASzCFEHOO7IPQOgSiOg8,2944
59
59
  cornflow/endpoints/signup.py,sha256=12bziq9qq9BMcrM0XmBrAurucbsHnBe5DbDaHZyw91U,3723
60
60
  cornflow/endpoints/tables.py,sha256=KI4sgkBHdiHbOnIRR_yoZ859ea3rnp_6ji_XvQbwsZ8,3071
61
61
  cornflow/endpoints/token.py,sha256=UEnsNNQAd6lJi2aF972d8uUWNJHT4ZcRr0eYpN458R4,1193
@@ -70,30 +70,32 @@ cornflow/migrations/versions/1af47a419bbd_.py,sha256=F6XOkxhojBbOSv3EGiWJvvncSMN
70
70
  cornflow/migrations/versions/4aac5e0c6e66_.py,sha256=ecWq38w_1vWpbLqsEkTsPw1tGv88OMt9L8JNZHlu7LI,2200
71
71
  cornflow/migrations/versions/7c3ea5ab5501_.py,sha256=TX9Are_ELRweHeGOo3tV4XAB9cFIVH6LAooCvoNfJxU,1569
72
72
  cornflow/migrations/versions/991b98e24225_.py,sha256=oNDQKQw6SfMdAB9HYV9Vb-haz5dJQo9lp3uJR-K9xYk,834
73
+ cornflow/migrations/versions/999b98e24225.py,sha256=w8VS-u4ZGZz2hMBqgIXxdM8u07u62IibE5-Hz3oAboY,860
73
74
  cornflow/migrations/versions/a472b5ad50b7_.py,sha256=RpaLV-eTZmOS4BN53F_o0yG6ZGfmfKIJjrn2x2M6THw,1370
74
75
  cornflow/migrations/versions/c2db9409cb5f_.py,sha256=M6udQ0vaIJXEsGpb31ZqAdU_eDwvbHPvWLvNsGQx7yY,1812
75
76
  cornflow/migrations/versions/c8a6c762e818_.py,sha256=6xqEn2860c7HMTZPjgype1bMMFWDQAD2iHZa2KVdtgg,3574
76
77
  cornflow/migrations/versions/ca449af8034c_.py,sha256=wPdZMICTSwHPsgouHdOyNmgVSLPPvP3GCe2ie_7RaYU,2433
78
+ cornflow/migrations/versions/cef1df240b27_.py,sha256=TAdxyMSGPS2tFKGlkxuTL_vFM_2JgfnW0nyZgwi4P70,723
77
79
  cornflow/migrations/versions/d0e0700dcd8e_.py,sha256=NZ4KFvdcmTLtMvzUdexlowjpQN5D0tf-tS7YMM-VIRg,1624
78
80
  cornflow/migrations/versions/d1b5be1f0549_.py,sha256=FvrRoGE373moGY0VNcUVA1IhZ85CRdj-m9C0UScwYKA,1607
79
81
  cornflow/migrations/versions/e1a50dae1ac9_.py,sha256=NIRKFg1hvo4F-YqMdsYoX9VwzKlQNpsKsK1EgBxjq7I,3555
80
82
  cornflow/migrations/versions/e937a5234ce4_.py,sha256=460JyCKPN6XL5DDcJfC51WKr9V342ovVhuo8F7fwuo0,710
81
83
  cornflow/migrations/versions/ebdd955fcc5e_.py,sha256=MzLbzmiwMWWVkJWJ8EMmmBnCIOzvlwXKGFWxELnOQpE,1848
82
84
  cornflow/migrations/versions/f3bee20314a2_.py,sha256=pgfAeiPvFvPJXhWlFHq6Y7bjYFGvapsfHEFXXX8UJlE,1782
83
- cornflow/models/__init__.py,sha256=hvUe_9Xep1gl8hPKcWxCZN9sORH0Opskj_DnNs3bn24,500
85
+ cornflow/models/__init__.py,sha256=f18GOllEZhjrStcyF-2wDlXwwXx1_AnUQd99kH0b9z0,506
84
86
  cornflow/models/action.py,sha256=8MYzQ2qX5bG0zk28OufypzThkR7AU1J1el-5ABoTurg,1200
85
87
  cornflow/models/alarms.py,sha256=R_g3tkWNSJaAG4gSvthgJlyrueY9VDuIZPoVHk5lDvU,1682
86
88
  cornflow/models/base_data_model.py,sha256=AJY_HUW1bTT6bjLeRl21YuKTisriJByr6DevpZOrny4,4472
87
89
  cornflow/models/case.py,sha256=GEs-xeo0bJ5qJETDnIur-2q2IyR3NSj1K0jP3Arz4Xs,9572
88
- cornflow/models/dag.py,sha256=DhHpBqJXrLzPoVSyrS_rYI7BotdzITopJDKsql3mQnQ,2930
89
- cornflow/models/dag_permissions.py,sha256=QkhPxSLKxH5elIMdf-rnRtV_CEZBQDFFKUOWv15RgwI,1716
90
- cornflow/models/execution.py,sha256=9sq_GXSAgFgTpDX3kbJGwsHwNQGXH9E_gfNYIfNtDOk,6022
90
+ cornflow/models/dag.py,sha256=3Um_Y8T_QdHILR6_x1mvDjVISd6BcNZlmuXmFzMEFmY,2945
91
+ cornflow/models/dag_permissions.py,sha256=8RWnptmac8V4W9kfrfwf_cARdWSTGhkCEBip_mVMfjk,1731
92
+ cornflow/models/execution.py,sha256=9ogS9CYuDL0yVHWnabMZVNmjyKvLA-mxWEhvtsh1vGs,6009
91
93
  cornflow/models/instance.py,sha256=2E9kBKv1a8soaEAvG8X4qXQ4BVC-IWYD5WQcPmZQw00,3979
92
94
  cornflow/models/main_alarms.py,sha256=9S-Ohr2kYFFWB0HomrpSdDIoUr85Eu1rt90Om_Pa8VY,1748
93
95
  cornflow/models/meta_models.py,sha256=dW10OCqSPeKsPTHxdEEDM17qW36arPT5pYxIy3vRLKE,12132
94
- cornflow/models/permissions.py,sha256=vPHa0A40e18YLzQEzKk9BrqsDQWfguIlsfrSufmW9dY,2804
96
+ cornflow/models/permissions.py,sha256=Mzp69HkZqvb5eeZlyIwB16zjks5dzSD_-mC9LwvufZA,2805
95
97
  cornflow/models/role.py,sha256=dEASPw8-aLbRRkoyId2zk7lFTq1twpRPMTkwb0zEOIE,2052
96
- cornflow/models/user.py,sha256=cv9d10DVAKarcMLTc6PqsmrWzO9ugKrwCvRl5KwllO0,8749
98
+ cornflow/models/user.py,sha256=Bjmw32gQEJMwsZwIqgwXxwkfh2vLMfvHt-QyF8AvQfU,8738
97
99
  cornflow/models/user_role.py,sha256=rr-0S4sV5l6xDQIwd94c3bPepDA50NdStwd3MSzRJbU,4974
98
100
  cornflow/models/view.py,sha256=ajDnvKsm-F1uizk1egaLfZDka3fXF8TXC3zUvkktVIo,2066
99
101
  cornflow/schemas/__init__.py,sha256=ijW3cATETq-SbBCWarRtxLMvU2_oVkaqGbP2gH1KX8o,215
@@ -103,8 +105,8 @@ cornflow/schemas/case.py,sha256=OXRsDi_sdB47MQJ59S_1eMjDmLlpUtG7kTFNInV2-cI,2909
103
105
  cornflow/schemas/common.py,sha256=QYuxWcOl4smXFZr_vL07OVgH9H50ZywCrXxycVNr1qA,473
104
106
  cornflow/schemas/dag.py,sha256=0ENA75X9L8YqjJW6ZO1Sb4zE8OxB15_O49_nwA6eAVw,901
105
107
  cornflow/schemas/example_data.py,sha256=hbE8TJakFqOweHXiA3mduNETM6FCX6xLTiQuH3EkSTc,281
106
- cornflow/schemas/execution.py,sha256=Qb2is-EfFDG-S4_9i-37-M6jPO6Et4bLqNm5z9byNOw,4939
107
- cornflow/schemas/health.py,sha256=OpK94HNZomv4as_9cM6vBT9eCkn6NY9RmWswXg2qKcA,177
108
+ cornflow/schemas/execution.py,sha256=xdPh45GF4tA3cDuem9heqlpXLoa8nrMUKa9iYq1I2Qg,5380
109
+ cornflow/schemas/health.py,sha256=vwIgqa80mvgGEkji4XWPDaiHoLJVQ7iCrPulx1UaqK4,177
108
110
  cornflow/schemas/instance.py,sha256=qr4km0AlAhoNf9G1Il-pfHphT_vAiiLDpv7A9S3FKAw,1870
109
111
  cornflow/schemas/main_alarms.py,sha256=cC1_Vb1dmo_vdZpZQrA7jH-hRCjVtLRy6Z2JFBlTrlo,604
110
112
  cornflow/schemas/model_json.py,sha256=qUsdd1XmxhcsAmb1JB0xAsvucZoAeQhAQD_3wiY-rVo,202
@@ -120,9 +122,9 @@ cornflow/schemas/user_role.py,sha256=e5y6RgdZZtLqD-h2B3sa5WokI5-pT78tWw85IG34I74
120
122
  cornflow/schemas/view.py,sha256=ctq9Y1TmjrWdyOqgDYeEx7qbbuNLKfSiNOlFTlXmpaw,429
121
123
  cornflow/shared/__init__.py,sha256=1ahcBwWOsSjGI4FEm77JBQjitBdBszOncKcEMjzwGYE,29
122
124
  cornflow/shared/compress.py,sha256=pohQaGs1xbH8CN6URIH6BAHA--pFq7Hmjz8oI3c3B5c,1347
123
- cornflow/shared/const.py,sha256=IjkQaUMTQSOwsbSX773DNLpFbjZLyfmGRZ1NMeU7UEQ,3863
125
+ cornflow/shared/const.py,sha256=2WvvQNdvYVsTGJkYktY9lvZM94djYchm8_UHShAeYpQ,4819
124
126
  cornflow/shared/email.py,sha256=QNDDMv86LZObkevSCyUbLQeR2UD3zWScPIr82NDzYHQ,3437
125
- cornflow/shared/exceptions.py,sha256=E82488IiwTXCv8iwrnGvkTonhJcwbeE5ARO4Zsmhl2c,6966
127
+ cornflow/shared/exceptions.py,sha256=1Car7ZD9PBdNXpvvASpCqNtN3DihcWcyBeVUc5OKlTQ,7022
126
128
  cornflow/shared/licenses.py,sha256=Lc71Jw2NxVTFWtoXdQ9wJX_o3BDfYg1xVoehDXvnCkQ,1328
127
129
  cornflow/shared/log_config.py,sha256=FM2ajjp2MB4BlFbUHklnWInT7-LLjtrqQ0mo3k_HRmE,621
128
130
  cornflow/shared/query_tools.py,sha256=6yGLCWjv-I2a_ZU4A0IymyJq67fZPZdRcCGOGQQpSXg,1199
@@ -130,16 +132,17 @@ cornflow/shared/utils.py,sha256=g2ZsD3SwsqIHXZ7GWVAVB0F9gX7mT9dQkPgR2Ahsh6M,860
130
132
  cornflow/shared/utils_tables.py,sha256=JnyaQ-5d1alj230nir-6elC2i0QX-u-_32SAs2eDtC0,3298
131
133
  cornflow/shared/validators.py,sha256=Iy2jaGzS9ojqlTE_-vKH4oQKD89GN5C0EPEZMg6UZgc,4761
132
134
  cornflow/shared/authentication/__init__.py,sha256=cJIChk5X6hbA_16usEvfHr8g4JDFI6WKo0GPVOOiYHA,137
133
- cornflow/shared/authentication/auth.py,sha256=SiXMCHwyAXHL7Krd5Ubht16NPNXqSvf-85xyiEB2DK4,18247
134
- cornflow/shared/authentication/decorators.py,sha256=KevnUCkfRFQXD42mOnydUUgY2X0vao8aHRLUTEIGfq4,2634
135
+ cornflow/shared/authentication/auth.py,sha256=l1vgZWxbPC3jlOqnJQPcwP3L9mP3SrS_HYJqLLbKEzo,18793
136
+ cornflow/shared/authentication/decorators.py,sha256=DBq0q0trcMIiJp5gY-h8nOMuzci6Sol4Retv1Msb9dY,2624
135
137
  cornflow/shared/authentication/ldap.py,sha256=QfdC2X_ZMcIJabKC5pYWDGMhS5pIOJJvdZXuuiruq-M,4853
136
138
  cornflow/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
137
- cornflow/tests/const.py,sha256=2TT-i8mB31rbo0U4GKWzUbPJya0hEURME_N3yzGhGM8,2635
139
+ cornflow/tests/base_test_execution.py,sha256=BhoN2mavMVtI1dGdWyihX2nq44aDeWxDBqWdzMDq-BI,27709
140
+ cornflow/tests/const.py,sha256=yXCvk1uK8srKQf1hwB_Daz-6WGLql7roRxUtNg4tPWk,2710
138
141
  cornflow/tests/custom_liveServer.py,sha256=I_0YNrcKIwVmRov3zCQMWwcCWkMe5V246Hpa4gS8AZE,3079
139
142
  cornflow/tests/custom_test_case.py,sha256=tu8QS_TMdmoPfKQzr9eHSYNC_7T4cmrOjGxxufZ7U04,37797
140
143
  cornflow/tests/integration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
141
- cornflow/tests/integration/test_commands.py,sha256=FZcoEM-05D4MBMe0L0V-0sxk_L0zMbzQxb9UCd7iBe0,695
142
- cornflow/tests/integration/test_cornflowclient.py,sha256=ioAQmQKWW6mXVJhdF4LECZcGIOa_N0xPkFaGWGtxOO8,20963
144
+ cornflow/tests/integration/test_commands.py,sha256=A_OZgcn1UwRSrWmQHJI2iRNuRcWCRFp9j0KURO0jGvY,705
145
+ cornflow/tests/integration/test_cornflowclient.py,sha256=mwtlzn4MSjQNRhwV3yzhco3DHCS5BVFimTfmB8lB2Cc,20964
143
146
  cornflow/tests/ldap/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
144
147
  cornflow/tests/ldap/test_ldap_authentication.py,sha256=6Gu1WkF7MQmcV_10IJkpo2qEloZZ9zjpV18ANDD0HRw,4286
145
148
  cornflow/tests/unit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -147,33 +150,33 @@ cornflow/tests/unit/test_actions.py,sha256=plgnzBJnDiZRdVxt1sNJNL2KbW5ijPZ6MHdIU
147
150
  cornflow/tests/unit/test_alarms.py,sha256=P1QsbT09HuRWCDOALsvPFux9UJg2PgWmGX6pb2hmTXA,4529
148
151
  cornflow/tests/unit/test_apiview.py,sha256=F40cO4WSm4vKz7PJww2eK1T601lhmf7iQbewx95rwuc,7885
149
152
  cornflow/tests/unit/test_application.py,sha256=ZVmTQDUOkPRxHqt6mWU9G_lQ3jJNMJR0cx7IkLMFGrU,1715
150
- cornflow/tests/unit/test_cases.py,sha256=Ez9dxlZL-SUf9DW9b_A_qPowHqUZ-TA73DMOzeBeLIU,37718
153
+ cornflow/tests/unit/test_cases.py,sha256=x7ivL46gk1rYtLZrPqNnY9uD2zjQiTItX_h5K2CVbzc,37707
151
154
  cornflow/tests/unit/test_cli.py,sha256=18tjj2sNmRsgx6OK8Z-e96iLgsUz2hbJp6UZJfF-PAE,18887
152
- cornflow/tests/unit/test_commands.py,sha256=bcs5DNzEOTjTHKM0ecdsx_u4Uc54ElZ6IX9eqEv_sEA,14762
153
- cornflow/tests/unit/test_dags.py,sha256=XsOi5bBJQdQz3DmYAVJf1myoAsRyBBdmku-xBr0Bku0,13386
155
+ cornflow/tests/unit/test_commands.py,sha256=KtYsoQnuvsKt_bpVK4LFFIuWeKkf-ew3ttMzcsLn3-E,14772
156
+ cornflow/tests/unit/test_dags.py,sha256=ifd7-tLgQlQ8SbQDUFLMyAKd0Ug5c8OFD9Al3bHTuDw,13395
154
157
  cornflow/tests/unit/test_data_checks.py,sha256=6s50d1iuRTUcAYn14oEcRS39ZZ6E9ussU4YpkpYhtC4,8612
155
- cornflow/tests/unit/test_example_data.py,sha256=D-Tgnqw7NZlnBXaDcUU0reNhAca5JlJP2Sdn3KdS4Sw,4127
156
- cornflow/tests/unit/test_executions.py,sha256=fC9kMRqU3qMGQ9eH6WXlOkU8CKJe6l-DlAKln4ImCSU,18192
158
+ cornflow/tests/unit/test_example_data.py,sha256=1vi9M3vHknh6R3JdFcUHoaFXurbQXltl5AJYm2M18FI,4132
159
+ cornflow/tests/unit/test_executions.py,sha256=gTWHY2ZBhq7t1ziV2siu6od7CYgld2JpMgCAKUAHmHw,2570
157
160
  cornflow/tests/unit/test_external_role_creation.py,sha256=1YZ2Scj6HeoFxFO-KZr1M7pjyWqzjA77gAICSpiF-2g,31310
158
161
  cornflow/tests/unit/test_generate_from_schema.py,sha256=L1EdnASbDJ8SjrX1V4WnUKKwV0sRTwVnNYnxSpyeSeQ,15376
159
162
  cornflow/tests/unit/test_get_resources.py,sha256=f4SSYjA6W48vQJw9MMqM-srvskzHFTnxnd5-IuUamGo,4231
160
- cornflow/tests/unit/test_health.py,sha256=xT0OcnpxbxE0QJlyg4r1qCYDn-hwuk0Ynw5JA4cJtsY,1205
163
+ cornflow/tests/unit/test_health.py,sha256=b1hlY8zMejNNiB9FjRKmNHEH8IcRv65mh1PgyBqAqow,4440
161
164
  cornflow/tests/unit/test_instances.py,sha256=Mf9jijQOcDE3ylPfMTnVRocRegcugEdCnoMCqSmKKqQ,11083
162
165
  cornflow/tests/unit/test_instances_file.py,sha256=sbodxnuoT7n7jdELz-wpVXWt76E5UzUrQYyVpvnfbco,1986
163
166
  cornflow/tests/unit/test_licenses.py,sha256=oj1YdqdxzEdRtxyQiFmRyXyvLzNbl6BeiGCCZH_Y42c,1534
164
167
  cornflow/tests/unit/test_log_in.py,sha256=JfAy1GWEL145njCVEf00Eb_MpAzEiyXFwI3H_8prOrw,19289
165
- cornflow/tests/unit/test_main_alarms.py,sha256=y--A4Ap2X38TCCRgbimzaZ-QvnTqZY8KHCv7C8kTTwc,2060
168
+ cornflow/tests/unit/test_main_alarms.py,sha256=A0t9au6R-vrMmE-rw1BurwXX9gcVltDBLimwmBVdEHE,2047
166
169
  cornflow/tests/unit/test_permissions.py,sha256=Jd-4PtqBcWGrSZAuTlJD82qE65D9ZtGWBM6sJY1f_yA,8782
167
- cornflow/tests/unit/test_roles.py,sha256=1-EON_JsPAM3sVL8AUfgJYLLfb0s1FXL8LJS4nilF-g,18166
168
- cornflow/tests/unit/test_schema_from_models.py,sha256=7IfycOGO3U06baX8I-OPJfu-3ZAn5cv8RCdj9wvalMk,4421
169
- cornflow/tests/unit/test_schemas.py,sha256=6SpkeYsS3oWntUZEF3GldLqmNa-hpxg-WrKJVTgc-B4,7468
170
+ cornflow/tests/unit/test_roles.py,sha256=mgRBolVEIIPWBRq2Deu4W8Y50kNATcSe67mZJc-UuAg,18172
171
+ cornflow/tests/unit/test_schema_from_models.py,sha256=P6d-vNj4iifxogCipdoK8tk1r8yNx1gnHmRnblvzSZ0,4426
172
+ cornflow/tests/unit/test_schemas.py,sha256=Ev5QqT6Im87nE-1xL7QInsjzzglVlSMUd9pPYaWPdUs,7487
170
173
  cornflow/tests/unit/test_sign_up.py,sha256=6LSlME3tB8t9jtvJD-Lut3ia9UVHzqqET_3EQMcZQ7s,9486
171
174
  cornflow/tests/unit/test_tables.py,sha256=SW_K8LRLwR1nB0uH8CPQCjeN8Gei-TasAgkOinnAjLk,8969
172
175
  cornflow/tests/unit/test_token.py,sha256=PZ11b46UCQpCESsRiAPhpgWkGAsAwKCVNxVQai_kxXM,4199
173
176
  cornflow/tests/unit/test_users.py,sha256=N5tcF5nSncD0F_ZlBxGuS87p6kNS4hUzRLr3_AcnK-o,22802
174
- cornflow/tests/unit/tools.py,sha256=ag3sWv2WLi498R1GL5AOUnXqSsszD3UugzLZLC5NqAw,585
175
- cornflow-1.2.4.dist-info/METADATA,sha256=42cwpvGnN2xjCEOwxWZsWGMcora3CNzQtB2haM-jaJM,9527
176
- cornflow-1.2.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
177
- cornflow-1.2.4.dist-info/entry_points.txt,sha256=q9cPKAFBsmHkERCqQ2JcOTM-tVBLHTl-DGxwCXowAWM,46
178
- cornflow-1.2.4.dist-info/top_level.txt,sha256=Qj9kLFJW1PLb-ZV2s_aCkQ-Wi5W6KC6fFR-LTBrx-rU,24
179
- cornflow-1.2.4.dist-info/RECORD,,
177
+ cornflow/tests/unit/tools.py,sha256=7tOV6HKsmPUr07Qbh-kMPirrVuLj0E2oR89owlwX5wo,3781
178
+ cornflow-1.3.0rc1.dist-info/METADATA,sha256=-B_9UR_ttbBAxQhBxVhq6ZEoiMUa7XFWHi25Oq6sLgQ,9533
179
+ cornflow-1.3.0rc1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
180
+ cornflow-1.3.0rc1.dist-info/entry_points.txt,sha256=q9cPKAFBsmHkERCqQ2JcOTM-tVBLHTl-DGxwCXowAWM,46
181
+ cornflow-1.3.0rc1.dist-info/top_level.txt,sha256=Qj9kLFJW1PLb-ZV2s_aCkQ-Wi5W6KC6fFR-LTBrx-rU,24
182
+ cornflow-1.3.0rc1.dist-info/RECORD,,