cornflow 1.0.11a1__py3-none-any.whl → 1.1.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.
Files changed (34) hide show
  1. cornflow/cli/service.py +4 -0
  2. cornflow/commands/__init__.py +1 -1
  3. cornflow/commands/schemas.py +31 -0
  4. cornflow/config.py +6 -0
  5. cornflow/endpoints/__init__.py +15 -20
  6. cornflow/endpoints/example_data.py +64 -13
  7. cornflow/endpoints/execution.py +2 -1
  8. cornflow/endpoints/login.py +16 -13
  9. cornflow/endpoints/user.py +2 -2
  10. cornflow/migrations/versions/991b98e24225_.py +33 -0
  11. cornflow/models/user.py +4 -0
  12. cornflow/schemas/example_data.py +7 -2
  13. cornflow/schemas/execution.py +8 -1
  14. cornflow/schemas/solution_log.py +11 -5
  15. cornflow/schemas/user.py +3 -0
  16. cornflow/shared/authentication/auth.py +1 -1
  17. cornflow/shared/licenses.py +17 -54
  18. cornflow/tests/custom_test_case.py +17 -3
  19. cornflow/tests/integration/test_cornflowclient.py +20 -14
  20. cornflow/tests/unit/test_cases.py +95 -6
  21. cornflow/tests/unit/test_cli.py +5 -5
  22. cornflow/tests/unit/test_dags.py +48 -1
  23. cornflow/tests/unit/test_example_data.py +85 -12
  24. cornflow/tests/unit/test_executions.py +98 -8
  25. cornflow/tests/unit/test_instances.py +43 -5
  26. cornflow/tests/unit/test_main_alarms.py +8 -8
  27. cornflow/tests/unit/test_schemas.py +12 -1
  28. cornflow/tests/unit/test_token.py +17 -0
  29. cornflow/tests/unit/test_users.py +16 -0
  30. {cornflow-1.0.11a1.dist-info → cornflow-1.1.0a2.dist-info}/METADATA +2 -2
  31. {cornflow-1.0.11a1.dist-info → cornflow-1.1.0a2.dist-info}/RECORD +34 -33
  32. {cornflow-1.0.11a1.dist-info → cornflow-1.1.0a2.dist-info}/WHEEL +0 -0
  33. {cornflow-1.0.11a1.dist-info → cornflow-1.1.0a2.dist-info}/entry_points.txt +0 -0
  34. {cornflow-1.0.11a1.dist-info → cornflow-1.1.0a2.dist-info}/top_level.txt +0 -0
@@ -43,6 +43,21 @@ class TestExecutionsListEndpoint(BaseTestCases.ListFilters):
43
43
  self.bad_payload = load_file_fk(BAD_EXECUTION_PATH)
44
44
  self.payloads = [load_file_fk(f) for f in EXECUTIONS_LIST]
45
45
  self.solution = load_file_fk(EXECUTION_SOLUTION_PATH)
46
+ self.keys_to_check = [
47
+ "data_hash",
48
+ "created_at",
49
+ "config",
50
+ "state",
51
+ "message",
52
+ "schema",
53
+ "description",
54
+ "id",
55
+ "user_id",
56
+ "log",
57
+ "instance_id",
58
+ "name",
59
+ "indicators",
60
+ ]
46
61
 
47
62
  def test_new_execution(self):
48
63
  self.create_new_row(self.url, self.model, payload=self.payload)
@@ -115,13 +130,13 @@ class TestExecutionsListEndpoint(BaseTestCases.ListFilters):
115
130
  self.assertTrue("error" in response.json)
116
131
 
117
132
  def test_get_executions(self):
118
- self.get_rows(self.url, self.payloads)
133
+ self.get_rows(self.url, self.payloads, keys_to_check=self.keys_to_check)
119
134
 
120
135
  def test_get_no_executions(self):
121
136
  self.get_no_rows(self.url)
122
137
 
123
138
  def test_get_executions_superadmin(self):
124
- self.get_rows(self.url, self.payloads)
139
+ self.get_rows(self.url, self.payloads, keys_to_check=self.keys_to_check)
125
140
  token = self.create_service_user()
126
141
  rows = self.client.get(
127
142
  self.url, follow_redirects=True, headers=self.get_header_with_auth(token)
@@ -275,15 +290,42 @@ class TestExecutionsDetailEndpoint(
275
290
 
276
291
  def test_create_delete_instance_load(self):
277
292
  idx = self.create_new_row(self.url + "?run=0", self.model, self.payload)
293
+ keys_to_check = [
294
+ "message",
295
+ "id",
296
+ "schema",
297
+ "data_hash",
298
+ "config",
299
+ "instance_id",
300
+ "user_id",
301
+ "indicators",
302
+ "description",
303
+ "name",
304
+ "created_at",
305
+ "state",
306
+ ]
278
307
  execution = self.get_one_row(
279
- self.url + idx, payload={**self.payload, **dict(id=idx)}
308
+ self.url + idx,
309
+ payload={**self.payload, **dict(id=idx)},
310
+ keys_to_check=keys_to_check,
280
311
  )
281
312
  self.delete_row(self.url + idx + "/")
313
+ keys_to_check = [
314
+ "id",
315
+ "schema",
316
+ "description",
317
+ "name",
318
+ "user_id",
319
+ "executions",
320
+ "created_at",
321
+ "data_hash",
322
+ ]
282
323
  instance = self.get_one_row(
283
324
  INSTANCE_URL + execution["instance_id"] + "/",
284
325
  payload={},
285
326
  expected_status=200,
286
327
  check_payload=False,
328
+ keys_to_check=keys_to_check,
287
329
  )
288
330
  executions = [execution["id"] for execution in instance["executions"]]
289
331
  self.assertFalse(idx in executions)
@@ -351,20 +393,41 @@ class TestExecutionsDataEndpoint(TestExecutionsDetailEndpointMock):
351
393
  super().setUp()
352
394
  self.response_items = {"id", "name", "data"}
353
395
  self.items_to_check = ["name"]
396
+ self.keys_to_check = [
397
+ "created_at",
398
+ "checks",
399
+ "instance_id",
400
+ "schema",
401
+ "data",
402
+ "user_id",
403
+ "message",
404
+ "data_hash",
405
+ "log",
406
+ "config",
407
+ "description",
408
+ "state",
409
+ "name",
410
+ "id",
411
+ ]
354
412
 
355
413
  def test_get_one_execution(self):
356
414
  idx = self.create_new_row(EXECUTION_URL_NORUN, self.model, self.payload)
357
415
  self.url = EXECUTION_URL + idx + "/data/"
358
416
  payload = dict(self.payload)
359
417
  payload["id"] = idx
360
- self.get_one_row(self.url, payload)
418
+ self.get_one_row(self.url, payload, keys_to_check=self.keys_to_check)
361
419
 
362
420
  def test_get_one_execution_superadmin(self):
363
421
  idx = self.create_new_row(EXECUTION_URL_NORUN, self.model, self.payload)
364
422
  payload = dict(self.payload)
365
423
  payload["id"] = idx
366
424
  token = self.create_service_user()
367
- self.get_one_row(EXECUTION_URL + idx + "/data/", payload, token=token)
425
+ self.get_one_row(
426
+ EXECUTION_URL + idx + "/data/",
427
+ payload,
428
+ token=token,
429
+ keys_to_check=self.keys_to_check,
430
+ )
368
431
 
369
432
 
370
433
  class TestExecutionsLogEndpoint(TestExecutionsDetailEndpointMock):
@@ -372,19 +435,42 @@ class TestExecutionsLogEndpoint(TestExecutionsDetailEndpointMock):
372
435
  super().setUp()
373
436
  self.response_items = {"id", "name", "log", "indicators"}
374
437
  self.items_to_check = ["name"]
438
+ self.keys_to_check = [
439
+ "created_at",
440
+ "id",
441
+ "log_text",
442
+ "instance_id",
443
+ "state",
444
+ "message",
445
+ "description",
446
+ "data_hash",
447
+ "name",
448
+ "log",
449
+ "schema",
450
+ "user_id",
451
+ "config",
452
+ "indicators",
453
+ ]
375
454
 
376
455
  def test_get_one_execution(self):
377
456
  idx = self.create_new_row(EXECUTION_URL_NORUN, self.model, self.payload)
378
457
  payload = dict(self.payload)
379
458
  payload["id"] = idx
380
- self.get_one_row(EXECUTION_URL + idx + "/log/", payload)
459
+ self.get_one_row(
460
+ EXECUTION_URL + idx + "/log/", payload, keys_to_check=self.keys_to_check
461
+ )
381
462
 
382
463
  def test_get_one_execution_superadmin(self):
383
464
  idx = self.create_new_row(EXECUTION_URL_NORUN, self.model, self.payload)
384
465
  payload = dict(self.payload)
385
466
  payload["id"] = idx
386
467
  token = self.create_service_user()
387
- self.get_one_row(EXECUTION_URL + idx + "/log/", payload, token=token)
468
+ self.get_one_row(
469
+ EXECUTION_URL + idx + "/log/",
470
+ payload,
471
+ token=token,
472
+ keys_to_check=self.keys_to_check,
473
+ )
388
474
 
389
475
 
390
476
  class TestExecutionsStatusEndpoint(TestExecutionsDetailEndpointMock):
@@ -400,8 +486,12 @@ class TestExecutionsStatusEndpoint(TestExecutionsDetailEndpointMock):
400
486
  idx = self.create_new_row(EXECUTION_URL, self.model, self.payload)
401
487
  payload = dict(self.payload)
402
488
  payload["id"] = idx
489
+ keys_to_check = ["state", "message", "id", "data_hash"]
403
490
  data = self.get_one_row(
404
- EXECUTION_URL + idx + "/status/", payload, check_payload=False
491
+ EXECUTION_URL + idx + "/status/",
492
+ payload,
493
+ check_payload=False,
494
+ keys_to_check=keys_to_check,
405
495
  )
406
496
  self.assertEqual(data["state"], 1)
407
497
 
@@ -36,6 +36,15 @@ class TestInstancesListEndpoint(BaseTestCases.ListFilters):
36
36
 
37
37
  self.payload = load_file(INSTANCE_PATH)
38
38
  self.payloads = [load_file(f) for f in INSTANCES_LIST]
39
+ self.keys_to_check = [
40
+ "data_hash",
41
+ "created_at",
42
+ "schema",
43
+ "description",
44
+ "id",
45
+ "user_id",
46
+ "name",
47
+ ]
39
48
 
40
49
  def test_new_instance(self):
41
50
  self.create_new_row(self.url, self.model, self.payload)
@@ -65,10 +74,10 @@ class TestInstancesListEndpoint(BaseTestCases.ListFilters):
65
74
  self.assertTrue("error" in response.json)
66
75
 
67
76
  def test_get_instances(self):
68
- self.get_rows(self.url, self.payloads)
77
+ self.get_rows(self.url, self.payloads, keys_to_check=self.keys_to_check)
69
78
 
70
79
  def test_get_instances_superadmin(self):
71
- self.get_rows(self.url, self.payloads)
80
+ self.get_rows(self.url, self.payloads, keys_to_check=self.keys_to_check)
72
81
  token = self.create_service_user()
73
82
  rows = self.client.get(
74
83
  self.url, follow_redirects=True, headers=self.get_header_with_auth(token)
@@ -173,7 +182,20 @@ class TestInstancesDataEndpoint(TestInstancesDetailEndpointBase):
173
182
  def test_get_one_instance(self):
174
183
  idx = self.create_new_row(self.url, self.model, self.payload)
175
184
  payload = {**self.payload, **dict(id=idx)}
176
- result = self.get_one_row(INSTANCE_URL + idx + "/data/", payload)
185
+ keys_to_check = [
186
+ "data",
187
+ "id",
188
+ "schema",
189
+ "data_hash",
190
+ "user_id",
191
+ "description",
192
+ "name",
193
+ "checks",
194
+ "created_at",
195
+ ]
196
+ result = self.get_one_row(
197
+ INSTANCE_URL + idx + "/data/", payload, keys_to_check=keys_to_check
198
+ )
177
199
  dif = self.response_items.symmetric_difference(result.keys())
178
200
  self.assertEqual(len(dif), 0)
179
201
 
@@ -208,6 +230,7 @@ class TestInstancesDataEndpoint(TestInstancesDetailEndpointBase):
208
230
  expected_status=404,
209
231
  check_payload=False,
210
232
  token=token,
233
+ keys_to_check=["error"],
211
234
  )
212
235
 
213
236
  def test_get_none_instance_planner_all(self):
@@ -232,8 +255,23 @@ class TestAccessPlannerUsers(CustomTestCase):
232
255
  idx = self.create_new_row(self.url, self.model, self.payload)
233
256
  token = self.create_planner()
234
257
  payload = {**self.payload, **dict(id=idx)}
235
-
236
- self.get_one_row(INSTANCE_URL + idx + "/data/", payload, token=token)
258
+ keys_to_check = [
259
+ "data",
260
+ "id",
261
+ "schema",
262
+ "data_hash",
263
+ "user_id",
264
+ "description",
265
+ "name",
266
+ "checks",
267
+ "created_at",
268
+ ]
269
+ self.get_one_row(
270
+ INSTANCE_URL + idx + "/data/",
271
+ payload,
272
+ token=token,
273
+ keys_to_check=keys_to_check,
274
+ )
237
275
 
238
276
  def test_get_all_instance_planner(self):
239
277
  # Test planner users can access objects of other users
@@ -1,6 +1,7 @@
1
1
  """
2
2
 
3
3
  """
4
+
4
5
  import json
5
6
 
6
7
  # Imports from internal modules
@@ -19,7 +20,7 @@ class TestMainAlarmsEndpoint(CustomTestCase):
19
20
  payload = {
20
21
  "name": "Alarm 1",
21
22
  "description": "Description Alarm 1",
22
- "criticality": 1
23
+ "criticality": 1,
23
24
  }
24
25
  self.id_alarm = self.client.post(
25
26
  ALARMS_URL,
@@ -32,7 +33,7 @@ class TestMainAlarmsEndpoint(CustomTestCase):
32
33
  payload = {
33
34
  "message": "Message Main Alarm 1",
34
35
  "criticality": 1,
35
- "id_alarm": self.id_alarm
36
+ "id_alarm": self.id_alarm,
36
37
  }
37
38
  self.create_new_row(self.url, self.model, payload)
38
39
 
@@ -41,23 +42,22 @@ class TestMainAlarmsEndpoint(CustomTestCase):
41
42
  {
42
43
  "message": "Message Main Alarm 1",
43
44
  "criticality": 1,
44
- "id_alarm": self.id_alarm
45
+ "id_alarm": self.id_alarm,
45
46
  },
46
47
  {
47
48
  "message": "Message Main Alarm 2",
48
49
  "criticality": 2,
49
50
  "schema": "solve_model_dag",
50
- "id_alarm": self.id_alarm
51
+ "id_alarm": self.id_alarm,
51
52
  },
52
53
  ]
54
+ keys_to_check = ["schema", "id_alarm", "criticality", "id", "message"]
53
55
  rows = self.get_rows(
54
- self.url,
55
- data,
56
- check_data=False
56
+ self.url, data, check_data=False, keys_to_check=keys_to_check
57
57
  )
58
58
  rows_data = list(rows.json)
59
59
  for i in range(len(data)):
60
60
  for key in self.get_keys_to_check(data[i]):
61
61
  self.assertIn(key, rows_data[i])
62
62
  if key in data[i]:
63
- self.assertEqual(rows_data[i][key], data[i][key])
63
+ self.assertEqual(rows_data[i][key], data[i][key])
@@ -1,6 +1,7 @@
1
1
  """
2
2
 
3
3
  """
4
+
4
5
  # General imports
5
6
  import unittest
6
7
 
@@ -159,11 +160,20 @@ class TestSchemaEndpoint(CustomTestCase):
159
160
  self.schema_name = "solve_model_dag"
160
161
 
161
162
  def test_get_schema(self):
163
+ keys_to_check = [
164
+ "solution_checks",
165
+ "instance_checks",
166
+ "config",
167
+ "solution",
168
+ "name",
169
+ "instance",
170
+ ]
162
171
  schemas = self.get_one_row(
163
172
  self.url + "{}/".format(self.schema_name),
164
173
  {},
165
174
  expected_status=200,
166
175
  check_payload=False,
176
+ keys_to_check=keys_to_check,
167
177
  )
168
178
  self.assertIn("instance", schemas)
169
179
  self.assertIn("solution", schemas)
@@ -178,7 +188,7 @@ class TestNewSchemaEndpointOpen(CustomTestCase):
178
188
  self.url = SCHEMA_URL
179
189
 
180
190
  def test_get_all_schemas(self):
181
- schemas = self.get_one_row(self.url, {}, 200, False)
191
+ schemas = self.get_one_row(self.url, {}, 200, False, keys_to_check=["name"])
182
192
  dags = [{"name": dag} for dag in ["solve_model_dag", "gc", "timer"]]
183
193
 
184
194
  self.assertEqual(dags, schemas)
@@ -205,6 +215,7 @@ class TestNewSchemaEndpointNotOpen(CustomTestCase):
205
215
  {},
206
216
  expected_status=403,
207
217
  check_payload=False,
218
+ keys_to_check=["error"],
208
219
  )
209
220
  self.assertEqual(
210
221
  {"error": "User does not have permission to access this dag"}, schema
@@ -41,6 +41,23 @@ class TestCheckToken(CheckTokenTestCase.TokenEndpoint):
41
41
  self.assertEqual(200, self.response.status_code)
42
42
  self.assertEqual(1, self.response.json["valid"])
43
43
 
44
+ def test_token_duration(self):
45
+ durations = [0.000000000001, 1]
46
+ asserts = [0, 1]
47
+ payload = self.data
48
+ for i in range(2):
49
+ current_app.config["TOKEN_DURATION"] = durations[i]
50
+ self.token = self.client.post(
51
+ LOGIN_URL,
52
+ data=json.dumps(payload),
53
+ follow_redirects=True,
54
+ headers={"Content-Type": "application/json"},
55
+ ).json["token"]
56
+
57
+ self.get_check_token()
58
+ self.assertEqual(200, self.response.status_code)
59
+ self.assertEqual(asserts[i], self.response.json["valid"])
60
+
44
61
  def test_get_invalid_token(self):
45
62
  self.token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2Mzk4MjAwNzMsImlhdCI6MTYzOTczMzY3Mywic3ViIjoxfQ"
46
63
  self.token += ".KzAYFDSrAJoCrnxGqKL2v6fE3oxT2muBgYztF1wcuN8"
@@ -1,6 +1,8 @@
1
1
  import json
2
2
 
3
+ from flask import current_app
3
4
  from flask_testing import TestCase
5
+ from datetime import datetime, timedelta
4
6
  from cornflow.app import create_app
5
7
  from cornflow.commands.access import access_init_command
6
8
  from cornflow.commands.dag import register_deployed_dags_command_test
@@ -359,6 +361,20 @@ class TestUserEndpoint(TestCase):
359
361
  self.assertEqual(200, response.status_code)
360
362
  self.assertIsNotNone(response.json["token"])
361
363
 
364
+ def test_change_password_rotation(self):
365
+ 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)
368
+ response = self.log_in(self.planner)
369
+ self.assertEqual(True, response.json["change_password"])
370
+
371
+ payload = {"password": "Newtestpassword1!"}
372
+ self.modify_info(self.planner, self.planner, payload)
373
+ self.planner.update(payload)
374
+ print(self.planner)
375
+ response = self.log_in(self.planner)
376
+ self.assertEqual(False, response.json["change_password"])
377
+
362
378
 
363
379
  class TestUserModel(TestCase):
364
380
  def create_app(self):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cornflow
3
- Version: 1.0.11a1
3
+ Version: 1.1.0a2
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
@@ -15,7 +15,7 @@ Requires-Python: >=3.8
15
15
  Requires-Dist: alembic ==1.9.2
16
16
  Requires-Dist: apispec <=6.2.0
17
17
  Requires-Dist: click <=8.1.3
18
- Requires-Dist: cornflow-client <=1.0.16
18
+ Requires-Dist: cornflow-client ==1.1.0a2
19
19
  Requires-Dist: cryptography <=42.0.5
20
20
  Requires-Dist: disposable-email-domains >=0.0.86
21
21
  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=3tj9aMOLFzBGS4QFPD0Zt2A7N0C5lssvy8NZ-G4sU9E,6997
9
- cornflow/config.py,sha256=mZyCr8BDMfLhR0J0UlYZDulYRYJs-ApTzvXed0wyZfE,4556
9
+ cornflow/config.py,sha256=CGG2BMn8l1gCB0Okk-8IRrtqiRIUK09fq3xO397ZHig,4738
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
@@ -16,7 +16,7 @@ cornflow/cli/migrations.py,sha256=Stc8H99rG8vgo3yRJcck11zBY_EA4WqyVybglfl8zJE,16
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=yhQT860oXmQFU_maHHL276tYubKUs6YcwheWv7x7oh0,9135
19
+ cornflow/cli/service.py,sha256=7_va2Gv1qySldWtTHLL0b_Tg6tuYzAVduyeKmoiBgVs,9292
20
20
  cornflow/cli/users.py,sha256=nPnu8rQNLtwmeXLwYtJ_hjlsa_24XOnQLgBJRBP9bJw,2104
21
21
  cornflow/cli/utils.py,sha256=0tF41gTt6LL9XGOizTQg2GXuOXbqLg6gapCr-HWjJ0Q,733
22
22
  cornflow/cli/views.py,sha256=Xyx2l-Sm7panxQEfR3qksCIUoqF7woMKsYgZALkxUXM,636
@@ -27,29 +27,29 @@ cornflow/cli/tools/models_tools.py,sha256=GGqO8fmksA37jhP_xm1dMMAJRZ8_k9j-0V2J05
27
27
  cornflow/cli/tools/schema_generator.py,sha256=3zfxQUej8BwPwmrGttjpK0R_oSnXIJQWOqoott-E78E,7557
28
28
  cornflow/cli/tools/schemas_tools.py,sha256=56VQfsUC6b1Hm5Ran1X6X4QF4HfTxrcOjWlGUCL7BAw,2245
29
29
  cornflow/cli/tools/tools.py,sha256=Qm0X-wHN12vXYJNRHONGjqDZewwXyXy4R_j4UT_XMLs,929
30
- cornflow/commands/__init__.py,sha256=E-IgJGF9NNYVhyWYh5ZYP6o0QucWVpJ9N2sbSxFkDmI,515
30
+ cornflow/commands/__init__.py,sha256=_7mi2Sd8bnaSujU-L78z8Zrswz68NJ2xoocYpsEYmPM,544
31
31
  cornflow/commands/access.py,sha256=NTZJFF9la8TDuMcD_ISQtJTj-wtM2p1dddokQJHtkj0,748
32
32
  cornflow/commands/actions.py,sha256=4AwgAmyI6VeaugkISvTlNGrIzMMU_-ZB3MhwDD_CIEA,1544
33
33
  cornflow/commands/cleanup.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
34
  cornflow/commands/dag.py,sha256=KwCQwx9yvmjTG_fOsYKuZJluEYjvLOq014657eu7sPA,3715
35
35
  cornflow/commands/permissions.py,sha256=mDPqiY2r2YXlUg4wmZRoI4GAMVFC6AjNT3kqzPEKUw8,6627
36
36
  cornflow/commands/roles.py,sha256=Oux-UkswkQ74zqaMEJYIEsZpQZGBcGaSahVzx9feAHU,1516
37
- cornflow/commands/schemas.py,sha256=NCSAIi722CrnTrAcFvQeklu36ijIe534nW8kfR92Fk0,902
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=EGUIDL5EGsDQtm1YQ4aKkmRG1roW_3Ki87MeZr79Lx0,7168
40
+ cornflow/endpoints/__init__.py,sha256=RI-cNRxYFCuYELPdM0kDDgJhopMMX88HJe-ArTTilNM,7346
41
41
  cornflow/endpoints/action.py,sha256=ksHK3F919cjkONLcFV2tUIbG-eZw5XbYkqVjYx9iq5I,1359
42
42
  cornflow/endpoints/alarms.py,sha256=3FN7mosBFP_DcJQxfg1h5_phy755FYESXyQ62XpvFbs,1956
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
46
46
  cornflow/endpoints/data_check.py,sha256=ZyYR84IT9snjXxUrQfrlv_RzOec_AYeTsijuHYdLAcA,16496
47
- cornflow/endpoints/example_data.py,sha256=fzolSYl1sYCSCR4Ctr7QD9JM3NdxCjBiiQLVxCPCbJg,2441
48
- cornflow/endpoints/execution.py,sha256=TQ-JtgFtYXVXJIbVs12qxWwGigfLrg9PzdTP0fK6k4g,27951
47
+ cornflow/endpoints/example_data.py,sha256=1_qAtZfp51N9sU8WCFDZCXOQiOlxCKJjWbXxDOFZ0C8,4372
48
+ cornflow/endpoints/execution.py,sha256=5SWwgbxBUj_gDU6Yb7Z-iKNakr9vr3g5qU82Bw9y5wQ,27998
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=4UjxgvIzkQnKMuEtbP1PCdKrlUVq6paIrg2uVsdgcdI,7968
52
+ cornflow/endpoints/login.py,sha256=HMPBQm_yEBzPCvBU_UHlOkUYgtWJG5rL9euR8Dzxm0w,7864
53
53
  cornflow/endpoints/main_alarms.py,sha256=GUB-UdnvEFi7n6FGFKO9VtZeZb4Ox3NvBMhB7rdqNyI,2006
54
54
  cornflow/endpoints/meta_resource.py,sha256=eqC6U8IpY65Cbk2WpdphRtE6o5kes2lB4LhezfUB7xI,8471
55
55
  cornflow/endpoints/permission.py,sha256=FpEBIucfUl89UaJ80SC0VR6pFAdqdSsS43SdNkcXWtI,3751
@@ -58,7 +58,7 @@ cornflow/endpoints/schemas.py,sha256=lHyvSpPj0x7zVYDlEeRrz_Qqyp6WNimibs5gK4BHpKI
58
58
  cornflow/endpoints/signup.py,sha256=4Xle2aTd6fiblb2pFcTaBP3ykXSuXsrc7qD0JjpqeZY,3513
59
59
  cornflow/endpoints/tables.py,sha256=KI4sgkBHdiHbOnIRR_yoZ859ea3rnp_6ji_XvQbwsZ8,3071
60
60
  cornflow/endpoints/token.py,sha256=UEnsNNQAd6lJi2aF972d8uUWNJHT4ZcRr0eYpN458R4,1193
61
- cornflow/endpoints/user.py,sha256=l-QVCNRGoAW6xv4DrE84Rj_bGWmB7ouiUWAiORNae_s,11751
61
+ cornflow/endpoints/user.py,sha256=FudDlINtgqJqqKaDcxCWEvYuL6QL_bZbK5YjGI0OLO0,11775
62
62
  cornflow/endpoints/user_role.py,sha256=RRV2LvyrkfPvb97bFNAdW4e1j-C8eDlrk-CPFf87IjE,6524
63
63
  cornflow/migrations/README,sha256=JL0NrjOrscPcKgRmQh1R3hlv1_rohDot0TvpmdM27Jk,41
64
64
  cornflow/migrations/alembic.ini,sha256=SjYEmJKzz6K8QfuZWtLJAJWcCKOdRbfUhsVlpgv8ock,857
@@ -68,6 +68,7 @@ cornflow/migrations/versions/00757b557b02_.py,sha256=PtFD0nIRBHjpDiCrhudxReI6ej6
68
68
  cornflow/migrations/versions/1af47a419bbd_.py,sha256=F6XOkxhojBbOSv3EGiWJvvncSMNAUPy2h5-NV2Gd5ak,1926
69
69
  cornflow/migrations/versions/4aac5e0c6e66_.py,sha256=ecWq38w_1vWpbLqsEkTsPw1tGv88OMt9L8JNZHlu7LI,2200
70
70
  cornflow/migrations/versions/7c3ea5ab5501_.py,sha256=TX9Are_ELRweHeGOo3tV4XAB9cFIVH6LAooCvoNfJxU,1569
71
+ cornflow/migrations/versions/991b98e24225_.py,sha256=oNDQKQw6SfMdAB9HYV9Vb-haz5dJQo9lp3uJR-K9xYk,834
71
72
  cornflow/migrations/versions/a472b5ad50b7_.py,sha256=RpaLV-eTZmOS4BN53F_o0yG6ZGfmfKIJjrn2x2M6THw,1370
72
73
  cornflow/migrations/versions/c2db9409cb5f_.py,sha256=M6udQ0vaIJXEsGpb31ZqAdU_eDwvbHPvWLvNsGQx7yY,1812
73
74
  cornflow/migrations/versions/c8a6c762e818_.py,sha256=6xqEn2860c7HMTZPjgype1bMMFWDQAD2iHZa2KVdtgg,3574
@@ -91,7 +92,7 @@ cornflow/models/main_alarms.py,sha256=9S-Ohr2kYFFWB0HomrpSdDIoUr85Eu1rt90Om_Pa8V
91
92
  cornflow/models/meta_models.py,sha256=qeliGdpw0_q0GCeZzansF-09Ay5pueaT-QQPVPZ5aj4,12000
92
93
  cornflow/models/permissions.py,sha256=vPHa0A40e18YLzQEzKk9BrqsDQWfguIlsfrSufmW9dY,2804
93
94
  cornflow/models/role.py,sha256=dEASPw8-aLbRRkoyId2zk7lFTq1twpRPMTkwb0zEOIE,2052
94
- cornflow/models/user.py,sha256=UrwXImyLvBqYxAL7FRR0U8uIrIZu6HP13if5HC5K0oA,8560
95
+ cornflow/models/user.py,sha256=podqU5Emhe52ytsUnrBcKShk_jSH_0Em0UXZEAmWgjI,8755
95
96
  cornflow/models/user_role.py,sha256=rr-0S4sV5l6xDQIwd94c3bPepDA50NdStwd3MSzRJbU,4974
96
97
  cornflow/models/view.py,sha256=ajDnvKsm-F1uizk1egaLfZDka3fXF8TXC3zUvkktVIo,2066
97
98
  cornflow/schemas/__init__.py,sha256=ijW3cATETq-SbBCWarRtxLMvU2_oVkaqGbP2gH1KX8o,215
@@ -100,8 +101,8 @@ cornflow/schemas/alarms.py,sha256=Y-VQ93jbDLtEv49qkNDHwrhwkG7OzEQ0nceqJCqeScQ,54
100
101
  cornflow/schemas/case.py,sha256=OXRsDi_sdB47MQJ59S_1eMjDmLlpUtG7kTFNInV2-cI,2909
101
102
  cornflow/schemas/common.py,sha256=QYuxWcOl4smXFZr_vL07OVgH9H50ZywCrXxycVNr1qA,473
102
103
  cornflow/schemas/dag.py,sha256=0ENA75X9L8YqjJW6ZO1Sb4zE8OxB15_O49_nwA6eAVw,901
103
- cornflow/schemas/example_data.py,sha256=7BeaujSgj10RHK6Z__4wRZ273-QmVjVOs6uEvYw7PnE,146
104
- cornflow/schemas/execution.py,sha256=BHqdhfAhtS6AEVhERw-s-oyO5j0sSwhciE7hjQxqW0I,4470
104
+ cornflow/schemas/example_data.py,sha256=hbE8TJakFqOweHXiA3mduNETM6FCX6xLTiQuH3EkSTc,281
105
+ cornflow/schemas/execution.py,sha256=GSRHzikVPlhxMdiKrGnTuGfen8_Lf4wSfheJwvcavTs,4718
105
106
  cornflow/schemas/health.py,sha256=D2NsP9i6nA1hLema-bvegrrdH4JY7pZlYxPcqRJOvao,141
106
107
  cornflow/schemas/instance.py,sha256=qr4km0AlAhoNf9G1Il-pfHphT_vAiiLDpv7A9S3FKAw,1870
107
108
  cornflow/schemas/main_alarms.py,sha256=cC1_Vb1dmo_vdZpZQrA7jH-hRCjVtLRy6Z2JFBlTrlo,604
@@ -111,9 +112,9 @@ cornflow/schemas/permissions.py,sha256=dgHKXLDyB1-q-Ii7cuHLpovlFPthtEV3mNxRgTe42
111
112
  cornflow/schemas/query.py,sha256=lQ6lMy0O6RRQLA-9JtQ95p70yd7vra4cGIbLrYO74GE,984
112
113
  cornflow/schemas/role.py,sha256=lZYoLpA0weuDiFgpk3PWrHYJdljvZ3HEIOS-ISNLcCg,469
113
114
  cornflow/schemas/schemas.py,sha256=vNyOwrchuTT3TMR9Jj07pauSr2sFTM-rfIfiKUycOjo,433
114
- cornflow/schemas/solution_log.py,sha256=mGO0FBOs6GJexKz5jxZsGAIkZ-7VgznzBE6nJFD9zWA,2163
115
+ cornflow/schemas/solution_log.py,sha256=jSutvj0-2RJIqzn7ANLFanAD4jrSDvtgqf6DF6UZBhs,2255
115
116
  cornflow/schemas/tables.py,sha256=6uEmG_ddXVPk-itY0aWms568fKroWzv73DtaQ5aeVng,105
116
- cornflow/schemas/user.py,sha256=Kc-WIHZYk8WqSJVaKlH-sGxHkMOCHO13CfYSc4T-Kyg,2045
117
+ cornflow/schemas/user.py,sha256=J4mbtQx4JWEvIXB3Ug-qHzNNQss5eFn3BkEImAqC9-o,2169
117
118
  cornflow/schemas/user_role.py,sha256=e5y6RgdZZtLqD-h2B3sa5WokI5-pT78tWw85IG34I74,615
118
119
  cornflow/schemas/view.py,sha256=ctq9Y1TmjrWdyOqgDYeEx7qbbuNLKfSiNOlFTlXmpaw,429
119
120
  cornflow/shared/__init__.py,sha256=1ahcBwWOsSjGI4FEm77JBQjitBdBszOncKcEMjzwGYE,29
@@ -121,54 +122,54 @@ cornflow/shared/compress.py,sha256=pohQaGs1xbH8CN6URIH6BAHA--pFq7Hmjz8oI3c3B5c,1
121
122
  cornflow/shared/const.py,sha256=nRZElCjbuJIpjzVlCfZjTN4mAbqDTXIyAbSMlkNL3n8,3440
122
123
  cornflow/shared/email.py,sha256=QNDDMv86LZObkevSCyUbLQeR2UD3zWScPIr82NDzYHQ,3437
123
124
  cornflow/shared/exceptions.py,sha256=BNbC5hzAoC9vDQ3NLM9uLqI14nwCEP1AT3UjeFghnY0,6979
124
- cornflow/shared/licenses.py,sha256=t3RpNEmmyY_dHel9Ss2FpCn_jD2g7-GYVS5jWpnA5Rc,2334
125
+ cornflow/shared/licenses.py,sha256=Lc71Jw2NxVTFWtoXdQ9wJX_o3BDfYg1xVoehDXvnCkQ,1328
125
126
  cornflow/shared/log_config.py,sha256=FM2ajjp2MB4BlFbUHklnWInT7-LLjtrqQ0mo3k_HRmE,621
126
127
  cornflow/shared/query_tools.py,sha256=6yGLCWjv-I2a_ZU4A0IymyJq67fZPZdRcCGOGQQpSXg,1199
127
128
  cornflow/shared/utils.py,sha256=g2ZsD3SwsqIHXZ7GWVAVB0F9gX7mT9dQkPgR2Ahsh6M,860
128
129
  cornflow/shared/utils_tables.py,sha256=A7bjpt7Metkb0FP7tKXMqOkak2fgi3O9dejYvoJBpb0,2236
129
130
  cornflow/shared/validators.py,sha256=aFKAAJ2diElUA8WdDyCcXJI6r3FV7HFVzoOTC6t4f8Y,4803
130
131
  cornflow/shared/authentication/__init__.py,sha256=cJIChk5X6hbA_16usEvfHr8g4JDFI6WKo0GPVOOiYHA,137
131
- cornflow/shared/authentication/auth.py,sha256=N0L074N7HxZ7TOhmPxIy8WSa7J4wofCbYVVCANI-Pn0,18621
132
+ cornflow/shared/authentication/auth.py,sha256=aQ8oUq9nC3FMbCivPFr2aWQXqP_cDeP6f7ljDhTm-wM,18664
132
133
  cornflow/shared/authentication/decorators.py,sha256=_QpwOU1kYzpaK85Dl0Btdj5hG8Ps47PFgySp_gqhlgk,1276
133
134
  cornflow/shared/authentication/ldap.py,sha256=QfdC2X_ZMcIJabKC5pYWDGMhS5pIOJJvdZXuuiruq-M,4853
134
135
  cornflow/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
135
136
  cornflow/tests/const.py,sha256=_5BYFGN42Xg0PXMR8UU5DBL6dYmYn5rgRBgPyptrKso,2499
136
137
  cornflow/tests/custom_liveServer.py,sha256=I_0YNrcKIwVmRov3zCQMWwcCWkMe5V246Hpa4gS8AZE,3079
137
- cornflow/tests/custom_test_case.py,sha256=6CJvYVlv6pdac1M--W80kUQ3qWEWIiGXNTvgYFaLRjw,24777
138
+ cornflow/tests/custom_test_case.py,sha256=EeAPnI0F5_0ZAQW0_ku0NdTzYxc8se6fi1FtYNdtLTc,25147
138
139
  cornflow/tests/integration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
139
140
  cornflow/tests/integration/test_commands.py,sha256=FZcoEM-05D4MBMe0L0V-0sxk_L0zMbzQxb9UCd7iBe0,695
140
- cornflow/tests/integration/test_cornflowclient.py,sha256=f77tPUmURdIdDoJCCVIom4PXsX95UARsBIPAtSy_AGc,20646
141
+ cornflow/tests/integration/test_cornflowclient.py,sha256=ioAQmQKWW6mXVJhdF4LECZcGIOa_N0xPkFaGWGtxOO8,20963
141
142
  cornflow/tests/ldap/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
142
143
  cornflow/tests/ldap/test_ldap_authentication.py,sha256=6Gu1WkF7MQmcV_10IJkpo2qEloZZ9zjpV18ANDD0HRw,4286
143
144
  cornflow/tests/unit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
144
145
  cornflow/tests/unit/test_actions.py,sha256=Fg33PyzNTK4B4NjARelMxLQpQl9nE9JppolkkIY9UEo,1755
145
146
  cornflow/tests/unit/test_alarms.py,sha256=J4Hp2xIZqpFrojx_RvQCSU1ilDk-iC0vm2z8wZNXwIw,1343
146
147
  cornflow/tests/unit/test_apiview.py,sha256=G5DpUPaKVXgbCOaXXTCjBAeGeCtfR8niltp7B0NNB6o,2107
147
- cornflow/tests/unit/test_cases.py,sha256=Wz6AQj4sEyRKu0WT-si11gR7H9p6JT_f2Sz44mG7eTU,23985
148
- cornflow/tests/unit/test_cli.py,sha256=IK7nhPpVy2dSXGRSies_Lh9DImNaL2SFCXb-gxKUmDI,12578
148
+ cornflow/tests/unit/test_cases.py,sha256=lXLgvHbNGw8qUoCtYUwwXE_O2AWSmSXxLVlxE-hc9Oc,25974
149
+ cornflow/tests/unit/test_cli.py,sha256=qYcMGAdLIOhTgWV4q0rGu0bv5Bs7JUIsyRd5qt6pcOI,12578
149
150
  cornflow/tests/unit/test_commands.py,sha256=QwGHTOxBOwiIYYQg8wcmSR11lKQk0I8Ltr3sbFERufw,8776
150
- cornflow/tests/unit/test_dags.py,sha256=Vww3_TDmHUnPvX2BJac6fXMp4y4UOWqnkYuzdVkBa4k,9034
151
+ cornflow/tests/unit/test_dags.py,sha256=5lTJW_fgh7XXE11Zo9yVsQ7wsmbCPxCCRwna2vkPEuA,10350
151
152
  cornflow/tests/unit/test_data_checks.py,sha256=VjB3AAQOHlqnaRT2jI9L2mNLDAcda6llpiZWkW7nnkk,5471
152
- cornflow/tests/unit/test_example_data.py,sha256=uaF66FpFNHAgHYH_6RH7Ylu1A6JcBU_qT7pNwS5IMOk,1518
153
- cornflow/tests/unit/test_executions.py,sha256=tNzkeOgZIdS-11FXNXLODIdfHCKZ5B1I4XuvyN8irj0,15333
153
+ cornflow/tests/unit/test_example_data.py,sha256=D-Tgnqw7NZlnBXaDcUU0reNhAca5JlJP2Sdn3KdS4Sw,4127
154
+ cornflow/tests/unit/test_executions.py,sha256=_hIaiZri7Blyx4DYhBDHh-0peU1HQh66RSPqQJFveE8,17501
154
155
  cornflow/tests/unit/test_generate_from_schema.py,sha256=L1EdnASbDJ8SjrX1V4WnUKKwV0sRTwVnNYnxSpyeSeQ,15376
155
156
  cornflow/tests/unit/test_health.py,sha256=0E0HXMb63_Z8drbLZdxnJwtTbQyaZS9ZEHut6qsDbh8,1033
156
- cornflow/tests/unit/test_instances.py,sha256=FWNxeP9LMkeCAoniEHioSFN2W_4yqbI-69pAMLkh-sY,9650
157
+ cornflow/tests/unit/test_instances.py,sha256=RaD9Tue2HODKThBNhciu6krdIvrauDLxOq4Y6a_z8DU,10573
157
158
  cornflow/tests/unit/test_instances_file.py,sha256=zXxSlOM_MMkFvpWNX-iatD40xoIAOGQkinCLf1txb0M,1986
158
159
  cornflow/tests/unit/test_licenses.py,sha256=jgnfE4UMFooGn44HK_KspJXIpmLjUpK_WgsBBeTO5eI,1534
159
160
  cornflow/tests/unit/test_log_in.py,sha256=zwVCNO0sGQhpVcUaJnh8cVv2z-qPEYCdI98y61CNyfE,979
160
- cornflow/tests/unit/test_main_alarms.py,sha256=H1LWQETlSQMsC6Rb3BB9ds7xL705t9aiPyp4gCWMwDQ,1970
161
+ cornflow/tests/unit/test_main_alarms.py,sha256=y--A4Ap2X38TCCRgbimzaZ-QvnTqZY8KHCv7C8kTTwc,2060
161
162
  cornflow/tests/unit/test_permissions.py,sha256=4mLj3GI0Bvhy927eXu_RyAmK8i2XD7raYc6W8lyAO04,8782
162
163
  cornflow/tests/unit/test_roles.py,sha256=xZ3TohL_sv1ZBPvHv_nnYSsKEhBlrzIchx9soaTb5Ow,16581
163
164
  cornflow/tests/unit/test_schema_from_models.py,sha256=7IfycOGO3U06baX8I-OPJfu-3ZAn5cv8RCdj9wvalMk,4421
164
- cornflow/tests/unit/test_schemas.py,sha256=nX78H0QhG3fThnw8CqS7EhDyuXWwMiA0pXVy52qhlUk,7177
165
+ cornflow/tests/unit/test_schemas.py,sha256=6SpkeYsS3oWntUZEF3GldLqmNa-hpxg-WrKJVTgc-B4,7468
165
166
  cornflow/tests/unit/test_sign_up.py,sha256=-i6VO9z1FwqRHFvaSrpWAzOZx6qa8mHUEmmsjuMXjn8,3481
166
167
  cornflow/tests/unit/test_tables.py,sha256=dY55YgaCkyqwJnqn0LbZHNeXBoL4ZxXWwKkCoTF4WVE,8947
167
- cornflow/tests/unit/test_token.py,sha256=QrEoBMeNvljKTmXxrTi4bS5GIVOyYLxhm3vbASD5GdI,3132
168
- cornflow/tests/unit/test_users.py,sha256=_GGnT3ltVEDWJcBUulUflhEx2eKIjbSFi74zY211k1I,21677
168
+ cornflow/tests/unit/test_token.py,sha256=OEVPgG8swSMkUbuGJGfGF5Z27utMLICn1eIyma1cM9E,3760
169
+ cornflow/tests/unit/test_users.py,sha256=WfaMcybPpR7rspXyvzHGgw25p751hMPAV0DOp_caSPM,22430
169
170
  cornflow/tests/unit/tools.py,sha256=ag3sWv2WLi498R1GL5AOUnXqSsszD3UugzLZLC5NqAw,585
170
- cornflow-1.0.11a1.dist-info/METADATA,sha256=GF6-8qUZgwsBxgGckAq-xQAO52NpxhVon7INJJ7exrk,9402
171
- cornflow-1.0.11a1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
172
- cornflow-1.0.11a1.dist-info/entry_points.txt,sha256=r5wKLHpuyVLMUIZ5I29_tpqYf-RuP-3w_8DhFi8_blQ,47
173
- cornflow-1.0.11a1.dist-info/top_level.txt,sha256=Qj9kLFJW1PLb-ZV2s_aCkQ-Wi5W6KC6fFR-LTBrx-rU,24
174
- cornflow-1.0.11a1.dist-info/RECORD,,
171
+ cornflow-1.1.0a2.dist-info/METADATA,sha256=Q3l-3geC8Y0gRpUe4cqdRz8NTtZ53IZ8eo6s_wdqyNc,9402
172
+ cornflow-1.1.0a2.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
173
+ cornflow-1.1.0a2.dist-info/entry_points.txt,sha256=r5wKLHpuyVLMUIZ5I29_tpqYf-RuP-3w_8DhFi8_blQ,47
174
+ cornflow-1.1.0a2.dist-info/top_level.txt,sha256=Qj9kLFJW1PLb-ZV2s_aCkQ-Wi5W6KC6fFR-LTBrx-rU,24
175
+ cornflow-1.1.0a2.dist-info/RECORD,,