mlrun 1.7.0rc7__py3-none-any.whl → 1.7.0rc11__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (91) hide show
  1. mlrun/__init__.py +1 -0
  2. mlrun/__main__.py +2 -0
  3. mlrun/artifacts/model.py +29 -25
  4. mlrun/common/schemas/__init__.py +4 -0
  5. mlrun/common/schemas/alert.py +122 -0
  6. mlrun/common/schemas/api_gateway.py +8 -1
  7. mlrun/common/schemas/auth.py +4 -0
  8. mlrun/common/schemas/client_spec.py +1 -0
  9. mlrun/common/schemas/hub.py +7 -9
  10. mlrun/common/schemas/model_monitoring/constants.py +4 -2
  11. mlrun/{datastore/helpers.py → common/schemas/pagination.py} +11 -3
  12. mlrun/common/schemas/project.py +15 -10
  13. mlrun/config.py +35 -13
  14. mlrun/datastore/__init__.py +3 -7
  15. mlrun/datastore/base.py +6 -5
  16. mlrun/datastore/datastore_profile.py +19 -1
  17. mlrun/datastore/snowflake_utils.py +43 -0
  18. mlrun/datastore/sources.py +18 -30
  19. mlrun/datastore/targets.py +140 -12
  20. mlrun/datastore/utils.py +10 -5
  21. mlrun/datastore/v3io.py +27 -50
  22. mlrun/db/base.py +88 -2
  23. mlrun/db/httpdb.py +314 -41
  24. mlrun/db/nopdb.py +142 -0
  25. mlrun/execution.py +21 -14
  26. mlrun/feature_store/api.py +9 -5
  27. mlrun/feature_store/feature_set.py +39 -23
  28. mlrun/feature_store/feature_vector.py +2 -1
  29. mlrun/feature_store/retrieval/spark_merger.py +27 -23
  30. mlrun/feature_store/steps.py +30 -19
  31. mlrun/features.py +4 -13
  32. mlrun/frameworks/auto_mlrun/auto_mlrun.py +2 -2
  33. mlrun/frameworks/lgbm/__init__.py +1 -1
  34. mlrun/frameworks/lgbm/callbacks/callback.py +2 -4
  35. mlrun/frameworks/lgbm/model_handler.py +1 -1
  36. mlrun/frameworks/pytorch/__init__.py +2 -2
  37. mlrun/frameworks/sklearn/__init__.py +1 -1
  38. mlrun/frameworks/tf_keras/__init__.py +1 -1
  39. mlrun/frameworks/tf_keras/callbacks/logging_callback.py +1 -1
  40. mlrun/frameworks/tf_keras/mlrun_interface.py +2 -2
  41. mlrun/frameworks/xgboost/__init__.py +1 -1
  42. mlrun/kfpops.py +2 -5
  43. mlrun/launcher/base.py +1 -1
  44. mlrun/launcher/client.py +2 -2
  45. mlrun/model.py +2 -2
  46. mlrun/model_monitoring/application.py +11 -2
  47. mlrun/model_monitoring/applications/histogram_data_drift.py +3 -3
  48. mlrun/model_monitoring/controller.py +2 -3
  49. mlrun/model_monitoring/helpers.py +3 -1
  50. mlrun/model_monitoring/stream_processing.py +0 -1
  51. mlrun/model_monitoring/writer.py +32 -0
  52. mlrun/package/packagers_manager.py +1 -0
  53. mlrun/platforms/__init__.py +1 -1
  54. mlrun/platforms/other.py +1 -1
  55. mlrun/projects/operations.py +11 -4
  56. mlrun/projects/pipelines.py +1 -1
  57. mlrun/projects/project.py +180 -73
  58. mlrun/run.py +77 -41
  59. mlrun/runtimes/__init__.py +16 -0
  60. mlrun/runtimes/base.py +4 -1
  61. mlrun/runtimes/kubejob.py +26 -121
  62. mlrun/runtimes/mpijob/abstract.py +8 -8
  63. mlrun/runtimes/nuclio/api_gateway.py +58 -8
  64. mlrun/runtimes/nuclio/application/application.py +79 -1
  65. mlrun/runtimes/nuclio/application/reverse_proxy.go +9 -1
  66. mlrun/runtimes/nuclio/function.py +20 -13
  67. mlrun/runtimes/nuclio/serving.py +11 -10
  68. mlrun/runtimes/pod.py +148 -3
  69. mlrun/runtimes/utils.py +0 -28
  70. mlrun/secrets.py +6 -2
  71. mlrun/serving/remote.py +2 -3
  72. mlrun/serving/routers.py +7 -4
  73. mlrun/serving/server.py +1 -1
  74. mlrun/serving/states.py +14 -38
  75. mlrun/serving/v2_serving.py +8 -7
  76. mlrun/utils/helpers.py +1 -1
  77. mlrun/utils/http.py +1 -1
  78. mlrun/utils/notifications/notification/base.py +12 -0
  79. mlrun/utils/notifications/notification/console.py +2 -0
  80. mlrun/utils/notifications/notification/git.py +3 -1
  81. mlrun/utils/notifications/notification/ipython.py +2 -0
  82. mlrun/utils/notifications/notification/slack.py +41 -13
  83. mlrun/utils/notifications/notification/webhook.py +11 -1
  84. mlrun/utils/retryer.py +3 -2
  85. mlrun/utils/version/version.json +2 -2
  86. {mlrun-1.7.0rc7.dist-info → mlrun-1.7.0rc11.dist-info}/METADATA +15 -15
  87. {mlrun-1.7.0rc7.dist-info → mlrun-1.7.0rc11.dist-info}/RECORD +91 -89
  88. {mlrun-1.7.0rc7.dist-info → mlrun-1.7.0rc11.dist-info}/LICENSE +0 -0
  89. {mlrun-1.7.0rc7.dist-info → mlrun-1.7.0rc11.dist-info}/WHEEL +0 -0
  90. {mlrun-1.7.0rc7.dist-info → mlrun-1.7.0rc11.dist-info}/entry_points.txt +0 -0
  91. {mlrun-1.7.0rc7.dist-info → mlrun-1.7.0rc11.dist-info}/top_level.txt +0 -0
@@ -21,6 +21,7 @@ import mlrun.common.model_monitoring
21
21
  import mlrun.common.schemas.model_monitoring
22
22
  from mlrun.artifacts import ModelArtifact # noqa: F401
23
23
  from mlrun.config import config
24
+ from mlrun.errors import err_to_str
24
25
  from mlrun.utils import logger, now_date
25
26
 
26
27
  from ..common.helpers import parse_versioned_object_uri
@@ -62,11 +63,11 @@ class V2ModelServer(StepToDict):
62
63
  class MyClass(V2ModelServer):
63
64
  def load(self):
64
65
  # load and initialize the model and/or other elements
65
- model_file, extra_data = self.get_model(suffix='.pkl')
66
+ model_file, extra_data = self.get_model(suffix=".pkl")
66
67
  self.model = load(open(model_file, "rb"))
67
68
 
68
69
  def predict(self, request):
69
- events = np.array(request['inputs'])
70
+ events = np.array(request["inputs"])
70
71
  dmatrix = xgb.DMatrix(events)
71
72
  result: xgb.DMatrix = self.model.predict(dmatrix)
72
73
  return {"outputs": result.tolist()}
@@ -175,9 +176,9 @@ class V2ModelServer(StepToDict):
175
176
  ::
176
177
 
177
178
  def load(self):
178
- model_file, extra_data = self.get_model(suffix='.pkl')
179
+ model_file, extra_data = self.get_model(suffix=".pkl")
179
180
  self.model = load(open(model_file, "rb"))
180
- categories = extra_data['categories'].as_df()
181
+ categories = extra_data["categories"].as_df()
181
182
 
182
183
  Parameters
183
184
  ----------
@@ -523,7 +524,7 @@ def _init_endpoint_record(
523
524
  graph_server.function_uri
524
525
  )
525
526
  except Exception as e:
526
- logger.error("Failed to parse function URI", exc=e)
527
+ logger.error("Failed to parse function URI", exc=err_to_str(e))
527
528
  return None
528
529
 
529
530
  # Generating version model value based on the model name and model version
@@ -576,9 +577,9 @@ def _init_endpoint_record(
576
577
  )
577
578
 
578
579
  except Exception as e:
579
- logger.error("Failed to create endpoint record", exc=e)
580
+ logger.error("Failed to create endpoint record", exc=err_to_str(e))
580
581
 
581
582
  except Exception as e:
582
- logger.error("Failed to retrieve model endpoint object", exc=e)
583
+ logger.error("Failed to retrieve model endpoint object", exc=err_to_str(e))
583
584
 
584
585
  return uid
mlrun/utils/helpers.py CHANGED
@@ -437,7 +437,7 @@ class LogBatchWriter:
437
437
 
438
438
  def get_in(obj, keys, default=None):
439
439
  """
440
- >>> get_in({'a': {'b': 1}}, 'a.b')
440
+ >>> get_in({"a": {"b": 1}}, "a.b")
441
441
  1
442
442
  """
443
443
  if isinstance(keys, str):
mlrun/utils/http.py CHANGED
@@ -122,7 +122,7 @@ class HTTPSessionWithRetry(requests.Session):
122
122
 
123
123
  self._logger.warning(
124
124
  "Error during request handling, retrying",
125
- exc=str(exc),
125
+ exc=err_to_str(exc),
126
126
  retry_count=retry_count,
127
127
  url=url,
128
128
  method=method,
@@ -44,6 +44,8 @@ class NotificationBase:
44
44
  ] = mlrun.common.schemas.NotificationSeverity.INFO,
45
45
  runs: typing.Union[mlrun.lists.RunList, list] = None,
46
46
  custom_html: str = None,
47
+ alert: mlrun.common.schemas.AlertConfig = None,
48
+ event_data: mlrun.common.schemas.Event = None,
47
49
  ):
48
50
  raise NotImplementedError()
49
51
 
@@ -61,6 +63,8 @@ class NotificationBase:
61
63
  ] = mlrun.common.schemas.NotificationSeverity.INFO,
62
64
  runs: typing.Union[mlrun.lists.RunList, list] = None,
63
65
  custom_html: str = None,
66
+ alert: mlrun.common.schemas.AlertConfig = None,
67
+ event_data: mlrun.common.schemas.Event = None,
64
68
  ) -> str:
65
69
  if custom_html:
66
70
  return custom_html
@@ -68,6 +72,14 @@ class NotificationBase:
68
72
  if self.name:
69
73
  message = f"{self.name}: {message}"
70
74
 
75
+ if alert:
76
+ if not event_data:
77
+ return f"[{severity}] {message}"
78
+ return (
79
+ f"[{severity}] {message} for project {alert.project} "
80
+ f"UID {event_data.entity.id}. Value {event_data.value}"
81
+ )
82
+
71
83
  if not runs:
72
84
  return f"[{severity}] {message}"
73
85
 
@@ -36,6 +36,8 @@ class ConsoleNotification(NotificationBase):
36
36
  ] = mlrun.common.schemas.NotificationSeverity.INFO,
37
37
  runs: typing.Union[mlrun.lists.RunList, list] = None,
38
38
  custom_html: str = None,
39
+ alert: mlrun.common.schemas.AlertConfig = None,
40
+ event_data: mlrun.common.schemas.Event = None,
39
41
  ):
40
42
  severity = self._resolve_severity(severity)
41
43
  print(f"[{severity}] {message}")
@@ -38,6 +38,8 @@ class GitNotification(NotificationBase):
38
38
  ] = mlrun.common.schemas.NotificationSeverity.INFO,
39
39
  runs: typing.Union[mlrun.lists.RunList, list] = None,
40
40
  custom_html: str = None,
41
+ alert: mlrun.common.schemas.AlertConfig = None,
42
+ event_data: mlrun.common.schemas.Event = None,
41
43
  ):
42
44
  git_repo = self.params.get("repo", None)
43
45
  git_issue = self.params.get("issue", None)
@@ -50,7 +52,7 @@ class GitNotification(NotificationBase):
50
52
  server = self.params.get("server", None)
51
53
  gitlab = self.params.get("gitlab", False)
52
54
  await self._pr_comment(
53
- self._get_html(message, severity, runs, custom_html),
55
+ self._get_html(message, severity, runs, custom_html, alert, event_data),
54
56
  git_repo,
55
57
  git_issue,
56
58
  merge_request=git_merge_request,
@@ -53,6 +53,8 @@ class IPythonNotification(NotificationBase):
53
53
  ] = mlrun.common.schemas.NotificationSeverity.INFO,
54
54
  runs: typing.Union[mlrun.lists.RunList, list] = None,
55
55
  custom_html: str = None,
56
+ alert: mlrun.common.schemas.AlertConfig = None,
57
+ event_data: mlrun.common.schemas.Event = None,
56
58
  ):
57
59
  if not self._ipython:
58
60
  mlrun.utils.helpers.logger.debug(
@@ -42,6 +42,8 @@ class SlackNotification(NotificationBase):
42
42
  ] = mlrun.common.schemas.NotificationSeverity.INFO,
43
43
  runs: typing.Union[mlrun.lists.RunList, list] = None,
44
44
  custom_html: str = None,
45
+ alert: mlrun.common.schemas.AlertConfig = None,
46
+ event_data: mlrun.common.schemas.Event = None,
45
47
  ):
46
48
  webhook = self.params.get("webhook", None) or mlrun.get_secret_or_env(
47
49
  "SLACK_WEBHOOK"
@@ -53,7 +55,7 @@ class SlackNotification(NotificationBase):
53
55
  )
54
56
  return
55
57
 
56
- data = self._generate_slack_data(message, severity, runs)
58
+ data = self._generate_slack_data(message, severity, runs, alert, event_data)
57
59
 
58
60
  async with aiohttp.ClientSession() as session:
59
61
  async with session.post(webhook, json=data) as response:
@@ -66,12 +68,14 @@ class SlackNotification(NotificationBase):
66
68
  mlrun.common.schemas.NotificationSeverity, str
67
69
  ] = mlrun.common.schemas.NotificationSeverity.INFO,
68
70
  runs: typing.Union[mlrun.lists.RunList, list] = None,
71
+ alert: mlrun.common.schemas.AlertConfig = None,
72
+ event_data: mlrun.common.schemas.Event = None,
69
73
  ) -> dict:
70
74
  data = {
71
75
  "blocks": [
72
76
  {
73
- "type": "section",
74
- "text": self._get_slack_row(f"[{severity}] {message}"),
77
+ "type": "header",
78
+ "text": {"type": "plain_text", "text": f"[{severity}] {message}"},
75
79
  },
76
80
  ]
77
81
  }
@@ -80,22 +84,46 @@ class SlackNotification(NotificationBase):
80
84
  {"type": "section", "text": self._get_slack_row(self.name)}
81
85
  )
82
86
 
83
- if not runs:
84
- return data
87
+ if alert:
88
+ fields = self._get_alert_fields(alert, event_data)
85
89
 
86
- if isinstance(runs, list):
87
- runs = mlrun.lists.RunList(runs)
90
+ for i in range(len(fields)):
91
+ data["blocks"].append({"type": "section", "text": fields[i]})
92
+ else:
93
+ if not runs:
94
+ return data
95
+
96
+ if isinstance(runs, list):
97
+ runs = mlrun.lists.RunList(runs)
88
98
 
89
- fields = [self._get_slack_row("*Runs*"), self._get_slack_row("*Results*")]
90
- for run in runs:
91
- fields.append(self._get_run_line(run))
92
- fields.append(self._get_run_result(run))
99
+ fields = [self._get_slack_row("*Runs*"), self._get_slack_row("*Results*")]
100
+ for run in runs:
101
+ fields.append(self._get_run_line(run))
102
+ fields.append(self._get_run_result(run))
93
103
 
94
- for i in range(0, len(fields), 8):
95
- data["blocks"].append({"type": "section", "fields": fields[i : i + 8]})
104
+ for i in range(0, len(fields), 8):
105
+ data["blocks"].append({"type": "section", "fields": fields[i : i + 8]})
96
106
 
97
107
  return data
98
108
 
109
+ def _get_alert_fields(
110
+ self,
111
+ alert: mlrun.common.schemas.AlertConfig,
112
+ event_data: mlrun.common.schemas.Event,
113
+ ) -> list:
114
+ line = [
115
+ self._get_slack_row(f":bell: {alert.name} alert has occurred"),
116
+ self._get_slack_row(f"*Project:*\n{alert.project}"),
117
+ self._get_slack_row(f"*UID:*\n{event_data.entity.id}"),
118
+ ]
119
+ if event_data.value is not None:
120
+ line.append(self._get_slack_row(f"*Event data:*\n{event_data.value}"))
121
+
122
+ if url := mlrun.utils.helpers.get_ui_url(alert.project, event_data.entity.id):
123
+ line.append(self._get_slack_row(f"*Overview:*\n<{url}|*Job overview*>"))
124
+
125
+ return line
126
+
99
127
  def _get_run_line(self, run: dict) -> dict:
100
128
  meta = run["metadata"]
101
129
  url = mlrun.utils.helpers.get_ui_url(meta.get("project"), meta.get("uid"))
@@ -36,6 +36,8 @@ class WebhookNotification(NotificationBase):
36
36
  ] = mlrun.common.schemas.NotificationSeverity.INFO,
37
37
  runs: typing.Union[mlrun.lists.RunList, list] = None,
38
38
  custom_html: str = None,
39
+ alert: mlrun.common.schemas.AlertConfig = None,
40
+ event_data: mlrun.common.schemas.Event = None,
39
41
  ):
40
42
  url = self.params.get("url", None)
41
43
  method = self.params.get("method", "post").lower()
@@ -46,9 +48,17 @@ class WebhookNotification(NotificationBase):
46
48
  request_body = {
47
49
  "message": message,
48
50
  "severity": severity,
49
- "runs": runs,
50
51
  }
51
52
 
53
+ if runs:
54
+ request_body["runs"] = runs
55
+
56
+ if alert:
57
+ request_body["alert"] = alert.dict()
58
+ if event_data:
59
+ request_body["value"] = event_data.value
60
+ request_body["id"] = event_data.entity.id
61
+
52
62
  if custom_html:
53
63
  request_body["custom_html"] = custom_html
54
64
 
mlrun/utils/retryer.py CHANGED
@@ -117,7 +117,7 @@ class Retryer:
117
117
  self._raise_last_exception()
118
118
 
119
119
  def _prepare(self):
120
- self.start_time = time.time()
120
+ self.start_time = time.monotonic()
121
121
  self.last_exception = None
122
122
 
123
123
  # Check if backoff is just a simple interval
@@ -138,6 +138,7 @@ class Retryer:
138
138
  except mlrun.errors.MLRunFatalFailureError as exc:
139
139
  raise exc.original_exception
140
140
  except Exception as exc:
141
+ self.last_exception = exc
141
142
  return (
142
143
  None,
143
144
  self.last_exception,
@@ -172,7 +173,7 @@ class Retryer:
172
173
  ) from self.last_exception
173
174
 
174
175
  def _timeout_exceeded(self, next_interval=None):
175
- now = time.time()
176
+ now = time.monotonic()
176
177
  if next_interval:
177
178
  now = now + next_interval
178
179
  return self.timeout is not None and now >= self.start_time + self.timeout
@@ -1,4 +1,4 @@
1
1
  {
2
- "git_commit": "06b1879c4a1857b20f07e805c46f51aa4ac74cef",
3
- "version": "1.7.0-rc7"
2
+ "git_commit": "fbea0ad0a63c1a8af06793354df5d3c467ca606d",
3
+ "version": "1.7.0-rc11"
4
4
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mlrun
3
- Version: 1.7.0rc7
3
+ Version: 1.7.0rc11
4
4
  Summary: Tracking and config of machine learning runs
5
5
  Home-page: https://github.com/mlrun/mlrun
6
6
  Author: Yaron Haviv
@@ -37,20 +37,20 @@ Requires-Dist: pyyaml ~=5.1
37
37
  Requires-Dist: requests ~=2.31
38
38
  Requires-Dist: tabulate ~=0.8.6
39
39
  Requires-Dist: v3io ~=0.6.4
40
- Requires-Dist: pydantic >=1.10.8,~=1.10
40
+ Requires-Dist: pydantic <1.10.15,>=1.10.8
41
41
  Requires-Dist: mergedeep ~=1.3
42
42
  Requires-Dist: v3io-frames ~=0.10.12
43
43
  Requires-Dist: semver ~=3.0
44
44
  Requires-Dist: dependency-injector ~=4.41
45
- Requires-Dist: fsspec ==2023.9.2
45
+ Requires-Dist: fsspec <2024.4,>=2023.9.2
46
46
  Requires-Dist: v3iofs ~=0.1.17
47
- Requires-Dist: storey ~=1.7.6
47
+ Requires-Dist: storey ~=1.7.7
48
48
  Requires-Dist: inflection ~=0.5.0
49
49
  Requires-Dist: python-dotenv ~=0.17.0
50
50
  Requires-Dist: setuptools ~=69.1
51
51
  Requires-Dist: deprecated ~=1.2
52
52
  Requires-Dist: jinja2 >=3.1.3,~=3.1
53
- Requires-Dist: orjson ~=3.9
53
+ Requires-Dist: orjson <4,>=3.9.15
54
54
  Provides-Extra: alibaba-oss
55
55
  Requires-Dist: ossfs ==2023.12.0 ; extra == 'alibaba-oss'
56
56
  Requires-Dist: oss2 ==2.18.1 ; extra == 'alibaba-oss'
@@ -66,7 +66,7 @@ Requires-Dist: boto3 <1.29.0,>=1.28.0 ; extra == 'all'
66
66
  Requires-Dist: dask ~=2023.9.0 ; extra == 'all'
67
67
  Requires-Dist: databricks-sdk ~=0.13.0 ; extra == 'all'
68
68
  Requires-Dist: distributed ~=2023.9.0 ; extra == 'all'
69
- Requires-Dist: gcsfs ==2023.9.2 ; extra == 'all'
69
+ Requires-Dist: gcsfs <2024.4,>=2023.9.2 ; extra == 'all'
70
70
  Requires-Dist: google-cloud-bigquery[bqstorage,pandas] ==3.14.1 ; extra == 'all'
71
71
  Requires-Dist: google-cloud-storage ==2.14.0 ; extra == 'all'
72
72
  Requires-Dist: google-cloud ==0.34 ; extra == 'all'
@@ -79,14 +79,14 @@ Requires-Dist: ossfs ==2023.12.0 ; extra == 'all'
79
79
  Requires-Dist: plotly <5.12.0,~=5.4 ; extra == 'all'
80
80
  Requires-Dist: pyopenssl >=23 ; extra == 'all'
81
81
  Requires-Dist: redis ~=4.3 ; extra == 'all'
82
- Requires-Dist: s3fs ==2023.9.2 ; extra == 'all'
82
+ Requires-Dist: s3fs <2024.4,>=2023.9.2 ; extra == 'all'
83
83
  Requires-Dist: sqlalchemy ~=1.4 ; extra == 'all'
84
84
  Provides-Extra: api
85
85
  Requires-Dist: uvicorn ~=0.27.1 ; extra == 'api'
86
86
  Requires-Dist: dask-kubernetes ~=0.11.0 ; extra == 'api'
87
87
  Requires-Dist: apscheduler <4,>=3.10.3 ; extra == 'api'
88
88
  Requires-Dist: objgraph ~=3.6 ; extra == 'api'
89
- Requires-Dist: igz-mgmt ~=0.1.1 ; extra == 'api'
89
+ Requires-Dist: igz-mgmt ~=0.1.3 ; extra == 'api'
90
90
  Requires-Dist: humanfriendly ~=10.0 ; extra == 'api'
91
91
  Requires-Dist: fastapi ~=0.110.0 ; extra == 'api'
92
92
  Requires-Dist: sqlalchemy ~=1.4 ; extra == 'api'
@@ -115,7 +115,7 @@ Requires-Dist: boto3 <1.29.0,>=1.28.0 ; extra == 'complete'
115
115
  Requires-Dist: dask ~=2023.9.0 ; extra == 'complete'
116
116
  Requires-Dist: databricks-sdk ~=0.13.0 ; extra == 'complete'
117
117
  Requires-Dist: distributed ~=2023.9.0 ; extra == 'complete'
118
- Requires-Dist: gcsfs ==2023.9.2 ; extra == 'complete'
118
+ Requires-Dist: gcsfs <2024.4,>=2023.9.2 ; extra == 'complete'
119
119
  Requires-Dist: google-cloud-bigquery[bqstorage,pandas] ==3.14.1 ; extra == 'complete'
120
120
  Requires-Dist: graphviz ~=0.20.0 ; extra == 'complete'
121
121
  Requires-Dist: kafka-python ~=2.0 ; extra == 'complete'
@@ -126,7 +126,7 @@ Requires-Dist: ossfs ==2023.12.0 ; extra == 'complete'
126
126
  Requires-Dist: plotly <5.12.0,~=5.4 ; extra == 'complete'
127
127
  Requires-Dist: pyopenssl >=23 ; extra == 'complete'
128
128
  Requires-Dist: redis ~=4.3 ; extra == 'complete'
129
- Requires-Dist: s3fs ==2023.9.2 ; extra == 'complete'
129
+ Requires-Dist: s3fs <2024.4,>=2023.9.2 ; extra == 'complete'
130
130
  Requires-Dist: sqlalchemy ~=1.4 ; extra == 'complete'
131
131
  Provides-Extra: complete-api
132
132
  Requires-Dist: adlfs ==2023.9.0 ; extra == 'complete-api'
@@ -143,11 +143,11 @@ Requires-Dist: dask ~=2023.9.0 ; extra == 'complete-api'
143
143
  Requires-Dist: databricks-sdk ~=0.13.0 ; extra == 'complete-api'
144
144
  Requires-Dist: distributed ~=2023.9.0 ; extra == 'complete-api'
145
145
  Requires-Dist: fastapi ~=0.110.0 ; extra == 'complete-api'
146
- Requires-Dist: gcsfs ==2023.9.2 ; extra == 'complete-api'
146
+ Requires-Dist: gcsfs <2024.4,>=2023.9.2 ; extra == 'complete-api'
147
147
  Requires-Dist: google-cloud-bigquery[bqstorage,pandas] ==3.14.1 ; extra == 'complete-api'
148
148
  Requires-Dist: graphviz ~=0.20.0 ; extra == 'complete-api'
149
149
  Requires-Dist: humanfriendly ~=10.0 ; extra == 'complete-api'
150
- Requires-Dist: igz-mgmt ~=0.1.1 ; extra == 'complete-api'
150
+ Requires-Dist: igz-mgmt ~=0.1.3 ; extra == 'complete-api'
151
151
  Requires-Dist: kafka-python ~=2.0 ; extra == 'complete-api'
152
152
  Requires-Dist: mlflow ~=2.8 ; extra == 'complete-api'
153
153
  Requires-Dist: msrest ~=0.6.21 ; extra == 'complete-api'
@@ -158,7 +158,7 @@ Requires-Dist: plotly <5.12.0,~=5.4 ; extra == 'complete-api'
158
158
  Requires-Dist: pymysql ~=1.0 ; extra == 'complete-api'
159
159
  Requires-Dist: pyopenssl >=23 ; extra == 'complete-api'
160
160
  Requires-Dist: redis ~=4.3 ; extra == 'complete-api'
161
- Requires-Dist: s3fs ==2023.9.2 ; extra == 'complete-api'
161
+ Requires-Dist: s3fs <2024.4,>=2023.9.2 ; extra == 'complete-api'
162
162
  Requires-Dist: sqlalchemy ~=1.4 ; extra == 'complete-api'
163
163
  Requires-Dist: timelength ~=1.1 ; extra == 'complete-api'
164
164
  Requires-Dist: uvicorn ~=0.27.1 ; extra == 'complete-api'
@@ -174,7 +174,7 @@ Requires-Dist: google-cloud ==0.34 ; extra == 'google-cloud'
174
174
  Provides-Extra: google-cloud-bigquery
175
175
  Requires-Dist: google-cloud-bigquery[bqstorage,pandas] ==3.14.1 ; extra == 'google-cloud-bigquery'
176
176
  Provides-Extra: google-cloud-storage
177
- Requires-Dist: gcsfs ==2023.9.2 ; extra == 'google-cloud-storage'
177
+ Requires-Dist: gcsfs <2024.4,>=2023.9.2 ; extra == 'google-cloud-storage'
178
178
  Provides-Extra: graphviz
179
179
  Requires-Dist: graphviz ~=0.20.0 ; extra == 'graphviz'
180
180
  Provides-Extra: kafka
@@ -189,7 +189,7 @@ Requires-Dist: redis ~=4.3 ; extra == 'redis'
189
189
  Provides-Extra: s3
190
190
  Requires-Dist: boto3 <1.29.0,>=1.28.0 ; extra == 's3'
191
191
  Requires-Dist: aiobotocore <2.8,>=2.5.0 ; extra == 's3'
192
- Requires-Dist: s3fs ==2023.9.2 ; extra == 's3'
192
+ Requires-Dist: s3fs <2024.4,>=2023.9.2 ; extra == 's3'
193
193
  Provides-Extra: sqlalchemy
194
194
  Requires-Dist: sqlalchemy ~=1.4 ; extra == 'sqlalchemy'
195
195