mlrun 1.7.0rc6__py3-none-any.whl → 1.7.0rc9__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 (84) hide show
  1. mlrun/__main__.py +2 -0
  2. mlrun/common/constants.py +6 -0
  3. mlrun/common/schemas/__init__.py +5 -0
  4. mlrun/common/schemas/api_gateway.py +8 -1
  5. mlrun/common/schemas/hub.py +7 -9
  6. mlrun/common/schemas/model_monitoring/__init__.py +4 -0
  7. mlrun/common/schemas/model_monitoring/constants.py +36 -19
  8. mlrun/{model_monitoring/stores/models/__init__.py → common/schemas/pagination.py} +9 -10
  9. mlrun/common/schemas/project.py +16 -10
  10. mlrun/common/types.py +7 -1
  11. mlrun/config.py +35 -10
  12. mlrun/data_types/data_types.py +4 -0
  13. mlrun/datastore/__init__.py +3 -7
  14. mlrun/datastore/alibaba_oss.py +130 -0
  15. mlrun/datastore/azure_blob.py +4 -5
  16. mlrun/datastore/base.py +22 -16
  17. mlrun/datastore/datastore.py +4 -0
  18. mlrun/datastore/datastore_profile.py +19 -1
  19. mlrun/datastore/google_cloud_storage.py +1 -1
  20. mlrun/datastore/snowflake_utils.py +43 -0
  21. mlrun/datastore/sources.py +11 -29
  22. mlrun/datastore/targets.py +131 -11
  23. mlrun/datastore/utils.py +10 -5
  24. mlrun/db/base.py +58 -6
  25. mlrun/db/httpdb.py +183 -77
  26. mlrun/db/nopdb.py +110 -0
  27. mlrun/feature_store/api.py +3 -2
  28. mlrun/feature_store/retrieval/spark_merger.py +27 -23
  29. mlrun/frameworks/tf_keras/callbacks/logging_callback.py +1 -1
  30. mlrun/frameworks/tf_keras/mlrun_interface.py +2 -2
  31. mlrun/kfpops.py +2 -5
  32. mlrun/launcher/base.py +1 -1
  33. mlrun/launcher/client.py +2 -2
  34. mlrun/model.py +1 -0
  35. mlrun/model_monitoring/__init__.py +1 -1
  36. mlrun/model_monitoring/api.py +104 -295
  37. mlrun/model_monitoring/controller.py +25 -25
  38. mlrun/model_monitoring/db/__init__.py +16 -0
  39. mlrun/model_monitoring/{stores → db/stores}/__init__.py +43 -34
  40. mlrun/model_monitoring/db/stores/base/__init__.py +15 -0
  41. mlrun/model_monitoring/{stores/model_endpoint_store.py → db/stores/base/store.py} +47 -6
  42. mlrun/model_monitoring/db/stores/sqldb/__init__.py +13 -0
  43. mlrun/model_monitoring/db/stores/sqldb/models/__init__.py +49 -0
  44. mlrun/model_monitoring/{stores → db/stores/sqldb}/models/base.py +76 -3
  45. mlrun/model_monitoring/db/stores/sqldb/models/mysql.py +68 -0
  46. mlrun/model_monitoring/{stores → db/stores/sqldb}/models/sqlite.py +13 -1
  47. mlrun/model_monitoring/db/stores/sqldb/sql_store.py +662 -0
  48. mlrun/model_monitoring/db/stores/v3io_kv/__init__.py +13 -0
  49. mlrun/model_monitoring/{stores/kv_model_endpoint_store.py → db/stores/v3io_kv/kv_store.py} +134 -3
  50. mlrun/model_monitoring/helpers.py +3 -3
  51. mlrun/model_monitoring/stream_processing.py +41 -9
  52. mlrun/model_monitoring/tracking_policy.py +7 -1
  53. mlrun/model_monitoring/writer.py +4 -36
  54. mlrun/projects/pipelines.py +14 -2
  55. mlrun/projects/project.py +141 -122
  56. mlrun/run.py +8 -2
  57. mlrun/runtimes/__init__.py +16 -0
  58. mlrun/runtimes/base.py +10 -1
  59. mlrun/runtimes/kubejob.py +26 -121
  60. mlrun/runtimes/nuclio/api_gateway.py +243 -66
  61. mlrun/runtimes/nuclio/application/application.py +79 -1
  62. mlrun/runtimes/nuclio/application/reverse_proxy.go +9 -1
  63. mlrun/runtimes/nuclio/function.py +14 -8
  64. mlrun/runtimes/nuclio/serving.py +30 -34
  65. mlrun/runtimes/pod.py +171 -0
  66. mlrun/runtimes/utils.py +0 -28
  67. mlrun/serving/remote.py +2 -3
  68. mlrun/serving/routers.py +4 -3
  69. mlrun/serving/server.py +5 -7
  70. mlrun/serving/states.py +40 -23
  71. mlrun/serving/v2_serving.py +4 -3
  72. mlrun/utils/helpers.py +34 -0
  73. mlrun/utils/http.py +1 -1
  74. mlrun/utils/retryer.py +1 -0
  75. mlrun/utils/version/version.json +2 -2
  76. {mlrun-1.7.0rc6.dist-info → mlrun-1.7.0rc9.dist-info}/METADATA +25 -16
  77. {mlrun-1.7.0rc6.dist-info → mlrun-1.7.0rc9.dist-info}/RECORD +81 -75
  78. mlrun/model_monitoring/batch.py +0 -933
  79. mlrun/model_monitoring/stores/models/mysql.py +0 -34
  80. mlrun/model_monitoring/stores/sql_model_endpoint_store.py +0 -382
  81. {mlrun-1.7.0rc6.dist-info → mlrun-1.7.0rc9.dist-info}/LICENSE +0 -0
  82. {mlrun-1.7.0rc6.dist-info → mlrun-1.7.0rc9.dist-info}/WHEEL +0 -0
  83. {mlrun-1.7.0rc6.dist-info → mlrun-1.7.0rc9.dist-info}/entry_points.txt +0 -0
  84. {mlrun-1.7.0rc6.dist-info → mlrun-1.7.0rc9.dist-info}/top_level.txt +0 -0
mlrun/serving/states.py CHANGED
@@ -14,7 +14,6 @@
14
14
 
15
15
  __all__ = ["TaskStep", "RouterStep", "RootFlowStep", "ErrorStep"]
16
16
 
17
- import asyncio
18
17
  import os
19
18
  import pathlib
20
19
  import traceback
@@ -591,7 +590,7 @@ class RouterStep(TaskStep):
591
590
 
592
591
  kind = "router"
593
592
  default_shape = "doubleoctagon"
594
- _dict_fields = _task_step_fields + ["routes"]
593
+ _dict_fields = _task_step_fields + ["routes", "engine"]
595
594
  _default_class = "mlrun.serving.ModelRouter"
596
595
 
597
596
  def __init__(
@@ -604,6 +603,7 @@ class RouterStep(TaskStep):
604
603
  function: str = None,
605
604
  input_path: str = None,
606
605
  result_path: str = None,
606
+ engine: str = None,
607
607
  ):
608
608
  super().__init__(
609
609
  class_name,
@@ -616,6 +616,8 @@ class RouterStep(TaskStep):
616
616
  )
617
617
  self._routes: ObjectDict = None
618
618
  self.routes = routes
619
+ self.engine = engine
620
+ self._controller = None
619
621
 
620
622
  def get_children(self):
621
623
  """get child steps (routes)"""
@@ -685,6 +687,33 @@ class RouterStep(TaskStep):
685
687
  self._set_error_handler()
686
688
  self._post_init(mode)
687
689
 
690
+ if self.engine == "async":
691
+ self._build_async_flow()
692
+ self._run_async_flow()
693
+
694
+ def _build_async_flow(self):
695
+ """initialize and build the async/storey DAG"""
696
+
697
+ self.respond()
698
+ source, self._wait_for_result = _init_async_objects(self.context, [self])
699
+ source.to(self.async_object)
700
+
701
+ self._async_flow = source
702
+
703
+ def _run_async_flow(self):
704
+ self._controller = self._async_flow.run()
705
+
706
+ def run(self, event, *args, **kwargs):
707
+ if self._controller:
708
+ # async flow (using storey)
709
+ event._awaitable_result = None
710
+ resp = self._controller.emit(
711
+ event, return_awaitable_result=self._wait_for_result
712
+ )
713
+ return resp.await_result()
714
+
715
+ return super().run(event, *args, **kwargs)
716
+
688
717
  def __getitem__(self, name):
689
718
  return self._routes[name]
690
719
 
@@ -1205,18 +1234,9 @@ class FlowStep(BaseStep):
1205
1234
  """wait for completion of run in async flows"""
1206
1235
 
1207
1236
  if self._controller:
1208
- if asyncio.iscoroutinefunction(self._controller.await_termination):
1209
-
1210
- async def terminate_and_await_termination():
1211
- if hasattr(self._controller, "terminate"):
1212
- await self._controller.terminate()
1213
- return await self._controller.await_termination()
1214
-
1215
- return terminate_and_await_termination()
1216
- else:
1217
- if hasattr(self._controller, "terminate"):
1218
- self._controller.terminate()
1219
- return self._controller.await_termination()
1237
+ if hasattr(self._controller, "terminate"):
1238
+ self._controller.terminate()
1239
+ return self._controller.await_termination()
1220
1240
 
1221
1241
  def plot(self, filename=None, format=None, source=None, targets=None, **kw):
1222
1242
  """plot/save graph using graphviz
@@ -1504,21 +1524,18 @@ def _init_async_objects(context, steps):
1504
1524
  endpoint = None
1505
1525
  options = {}
1506
1526
  options.update(step.options)
1507
- kafka_bootstrap_servers = options.pop(
1508
- "kafka_bootstrap_servers", None
1509
- )
1510
- if stream_path.startswith("kafka://") or kafka_bootstrap_servers:
1511
- topic, bootstrap_servers = parse_kafka_url(
1512
- stream_path, kafka_bootstrap_servers
1513
- )
1527
+ kafka_brokers = options.pop("kafka_brokers", None)
1528
+ if stream_path.startswith("kafka://") or kafka_brokers:
1529
+ topic, brokers = parse_kafka_url(stream_path, kafka_brokers)
1514
1530
 
1515
1531
  kafka_producer_options = options.pop(
1516
- "kafka_producer_options", None
1532
+ "kafka_producer_options",
1533
+ options.pop("kafka_bootstrap_servers", None),
1517
1534
  )
1518
1535
 
1519
1536
  step._async_object = storey.KafkaTarget(
1520
1537
  topic=topic,
1521
- bootstrap_servers=bootstrap_servers,
1538
+ brokers=brokers,
1522
1539
  producer_options=kafka_producer_options,
1523
1540
  context=context,
1524
1541
  **options,
@@ -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
@@ -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
@@ -1405,6 +1405,18 @@ def as_number(field_name, field_value):
1405
1405
 
1406
1406
 
1407
1407
  def filter_warnings(action, category):
1408
+ """
1409
+ Decorator to filter warnings
1410
+
1411
+ Example::
1412
+ @filter_warnings("ignore", FutureWarning)
1413
+ def my_function():
1414
+ pass
1415
+
1416
+ :param action: one of "error", "ignore", "always", "default", "module", or "once"
1417
+ :param category: a class that the warning must be a subclass of
1418
+ """
1419
+
1408
1420
  def decorator(function):
1409
1421
  def wrapper(*args, **kwargs):
1410
1422
  # context manager that copies and, upon exit, restores the warnings filter and the showwarning() function.
@@ -1562,3 +1574,25 @@ def is_safe_path(base, filepath, is_symlink=False):
1562
1574
  os.path.abspath(filepath) if not is_symlink else os.path.realpath(filepath)
1563
1575
  )
1564
1576
  return base == os.path.commonpath((base, resolved_filepath))
1577
+
1578
+
1579
+ def get_serving_spec():
1580
+ data = None
1581
+
1582
+ # we will have the serving spec in either mounted config map
1583
+ # or env depending on the size of the spec and configuration
1584
+
1585
+ try:
1586
+ with open(mlrun.common.constants.MLRUN_SERVING_SPEC_PATH) as f:
1587
+ data = f.read()
1588
+ except FileNotFoundError:
1589
+ pass
1590
+
1591
+ if data is None:
1592
+ data = os.environ.get("SERVING_SPEC_ENV", "")
1593
+ if not data:
1594
+ raise mlrun.errors.MLRunInvalidArgumentError(
1595
+ "Failed to find serving spec in env var or config file"
1596
+ )
1597
+ spec = json.loads(data)
1598
+ return spec
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,
mlrun/utils/retryer.py CHANGED
@@ -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,
@@ -1,4 +1,4 @@
1
1
  {
2
- "git_commit": "cbfd1ee5f41bee97ff90efbce14bac0a56b58dce",
3
- "version": "1.7.0-rc6"
2
+ "git_commit": "3396f9ef4c278411ca6227b1792ff7df20005a42",
3
+ "version": "1.7.0-rc9"
4
4
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mlrun
3
- Version: 1.7.0rc6
3
+ Version: 1.7.0rc9
4
4
  Summary: Tracking and config of machine learning runs
5
5
  Home-page: https://github.com/mlrun/mlrun
6
6
  Author: Yaron Haviv
@@ -36,21 +36,24 @@ Requires-Dist: pyarrow <15,>=10.0
36
36
  Requires-Dist: pyyaml ~=5.1
37
37
  Requires-Dist: requests ~=2.31
38
38
  Requires-Dist: tabulate ~=0.8.6
39
- Requires-Dist: v3io ~=0.6.2
40
- Requires-Dist: pydantic >=1.10.8,~=1.10
39
+ Requires-Dist: v3io ~=0.6.4
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.5
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
+ Provides-Extra: alibaba-oss
55
+ Requires-Dist: ossfs ==2023.12.0 ; extra == 'alibaba-oss'
56
+ Requires-Dist: oss2 ==2.18.1 ; extra == 'alibaba-oss'
54
57
  Provides-Extra: all
55
58
  Requires-Dist: adlfs ==2023.9.0 ; extra == 'all'
56
59
  Requires-Dist: aiobotocore <2.8,>=2.5.0 ; extra == 'all'
@@ -63,7 +66,7 @@ Requires-Dist: boto3 <1.29.0,>=1.28.0 ; extra == 'all'
63
66
  Requires-Dist: dask ~=2023.9.0 ; extra == 'all'
64
67
  Requires-Dist: databricks-sdk ~=0.13.0 ; extra == 'all'
65
68
  Requires-Dist: distributed ~=2023.9.0 ; extra == 'all'
66
- Requires-Dist: gcsfs ==2023.9.2 ; extra == 'all'
69
+ Requires-Dist: gcsfs <2024.4,>=2023.9.2 ; extra == 'all'
67
70
  Requires-Dist: google-cloud-bigquery[bqstorage,pandas] ==3.14.1 ; extra == 'all'
68
71
  Requires-Dist: google-cloud-storage ==2.14.0 ; extra == 'all'
69
72
  Requires-Dist: google-cloud ==0.34 ; extra == 'all'
@@ -71,17 +74,19 @@ Requires-Dist: graphviz ~=0.20.0 ; extra == 'all'
71
74
  Requires-Dist: kafka-python ~=2.0 ; extra == 'all'
72
75
  Requires-Dist: mlflow ~=2.8 ; extra == 'all'
73
76
  Requires-Dist: msrest ~=0.6.21 ; extra == 'all'
77
+ Requires-Dist: oss2 ==2.18.1 ; extra == 'all'
78
+ Requires-Dist: ossfs ==2023.12.0 ; extra == 'all'
74
79
  Requires-Dist: plotly <5.12.0,~=5.4 ; extra == 'all'
75
80
  Requires-Dist: pyopenssl >=23 ; extra == 'all'
76
81
  Requires-Dist: redis ~=4.3 ; extra == 'all'
77
- Requires-Dist: s3fs ==2023.9.2 ; extra == 'all'
82
+ Requires-Dist: s3fs <2024.4,>=2023.9.2 ; extra == 'all'
78
83
  Requires-Dist: sqlalchemy ~=1.4 ; extra == 'all'
79
84
  Provides-Extra: api
80
85
  Requires-Dist: uvicorn ~=0.27.1 ; extra == 'api'
81
86
  Requires-Dist: dask-kubernetes ~=0.11.0 ; extra == 'api'
82
87
  Requires-Dist: apscheduler <4,>=3.10.3 ; extra == 'api'
83
88
  Requires-Dist: objgraph ~=3.6 ; extra == 'api'
84
- Requires-Dist: igz-mgmt ~=0.1.0 ; extra == 'api'
89
+ Requires-Dist: igz-mgmt ~=0.1.3 ; extra == 'api'
85
90
  Requires-Dist: humanfriendly ~=10.0 ; extra == 'api'
86
91
  Requires-Dist: fastapi ~=0.110.0 ; extra == 'api'
87
92
  Requires-Dist: sqlalchemy ~=1.4 ; extra == 'api'
@@ -110,16 +115,18 @@ Requires-Dist: boto3 <1.29.0,>=1.28.0 ; extra == 'complete'
110
115
  Requires-Dist: dask ~=2023.9.0 ; extra == 'complete'
111
116
  Requires-Dist: databricks-sdk ~=0.13.0 ; extra == 'complete'
112
117
  Requires-Dist: distributed ~=2023.9.0 ; extra == 'complete'
113
- Requires-Dist: gcsfs ==2023.9.2 ; extra == 'complete'
118
+ Requires-Dist: gcsfs <2024.4,>=2023.9.2 ; extra == 'complete'
114
119
  Requires-Dist: google-cloud-bigquery[bqstorage,pandas] ==3.14.1 ; extra == 'complete'
115
120
  Requires-Dist: graphviz ~=0.20.0 ; extra == 'complete'
116
121
  Requires-Dist: kafka-python ~=2.0 ; extra == 'complete'
117
122
  Requires-Dist: mlflow ~=2.8 ; extra == 'complete'
118
123
  Requires-Dist: msrest ~=0.6.21 ; extra == 'complete'
124
+ Requires-Dist: oss2 ==2.18.1 ; extra == 'complete'
125
+ Requires-Dist: ossfs ==2023.12.0 ; extra == 'complete'
119
126
  Requires-Dist: plotly <5.12.0,~=5.4 ; extra == 'complete'
120
127
  Requires-Dist: pyopenssl >=23 ; extra == 'complete'
121
128
  Requires-Dist: redis ~=4.3 ; extra == 'complete'
122
- Requires-Dist: s3fs ==2023.9.2 ; extra == 'complete'
129
+ Requires-Dist: s3fs <2024.4,>=2023.9.2 ; extra == 'complete'
123
130
  Requires-Dist: sqlalchemy ~=1.4 ; extra == 'complete'
124
131
  Provides-Extra: complete-api
125
132
  Requires-Dist: adlfs ==2023.9.0 ; extra == 'complete-api'
@@ -136,20 +143,22 @@ Requires-Dist: dask ~=2023.9.0 ; extra == 'complete-api'
136
143
  Requires-Dist: databricks-sdk ~=0.13.0 ; extra == 'complete-api'
137
144
  Requires-Dist: distributed ~=2023.9.0 ; extra == 'complete-api'
138
145
  Requires-Dist: fastapi ~=0.110.0 ; extra == 'complete-api'
139
- Requires-Dist: gcsfs ==2023.9.2 ; extra == 'complete-api'
146
+ Requires-Dist: gcsfs <2024.4,>=2023.9.2 ; extra == 'complete-api'
140
147
  Requires-Dist: google-cloud-bigquery[bqstorage,pandas] ==3.14.1 ; extra == 'complete-api'
141
148
  Requires-Dist: graphviz ~=0.20.0 ; extra == 'complete-api'
142
149
  Requires-Dist: humanfriendly ~=10.0 ; extra == 'complete-api'
143
- Requires-Dist: igz-mgmt ~=0.1.0 ; extra == 'complete-api'
150
+ Requires-Dist: igz-mgmt ~=0.1.3 ; extra == 'complete-api'
144
151
  Requires-Dist: kafka-python ~=2.0 ; extra == 'complete-api'
145
152
  Requires-Dist: mlflow ~=2.8 ; extra == 'complete-api'
146
153
  Requires-Dist: msrest ~=0.6.21 ; extra == 'complete-api'
147
154
  Requires-Dist: objgraph ~=3.6 ; extra == 'complete-api'
155
+ Requires-Dist: oss2 ==2.18.1 ; extra == 'complete-api'
156
+ Requires-Dist: ossfs ==2023.12.0 ; extra == 'complete-api'
148
157
  Requires-Dist: plotly <5.12.0,~=5.4 ; extra == 'complete-api'
149
158
  Requires-Dist: pymysql ~=1.0 ; extra == 'complete-api'
150
159
  Requires-Dist: pyopenssl >=23 ; extra == 'complete-api'
151
160
  Requires-Dist: redis ~=4.3 ; extra == 'complete-api'
152
- Requires-Dist: s3fs ==2023.9.2 ; extra == 'complete-api'
161
+ Requires-Dist: s3fs <2024.4,>=2023.9.2 ; extra == 'complete-api'
153
162
  Requires-Dist: sqlalchemy ~=1.4 ; extra == 'complete-api'
154
163
  Requires-Dist: timelength ~=1.1 ; extra == 'complete-api'
155
164
  Requires-Dist: uvicorn ~=0.27.1 ; extra == 'complete-api'
@@ -165,7 +174,7 @@ Requires-Dist: google-cloud ==0.34 ; extra == 'google-cloud'
165
174
  Provides-Extra: google-cloud-bigquery
166
175
  Requires-Dist: google-cloud-bigquery[bqstorage,pandas] ==3.14.1 ; extra == 'google-cloud-bigquery'
167
176
  Provides-Extra: google-cloud-storage
168
- Requires-Dist: gcsfs ==2023.9.2 ; extra == 'google-cloud-storage'
177
+ Requires-Dist: gcsfs <2024.4,>=2023.9.2 ; extra == 'google-cloud-storage'
169
178
  Provides-Extra: graphviz
170
179
  Requires-Dist: graphviz ~=0.20.0 ; extra == 'graphviz'
171
180
  Provides-Extra: kafka
@@ -180,7 +189,7 @@ Requires-Dist: redis ~=4.3 ; extra == 'redis'
180
189
  Provides-Extra: s3
181
190
  Requires-Dist: boto3 <1.29.0,>=1.28.0 ; extra == 's3'
182
191
  Requires-Dist: aiobotocore <2.8,>=2.5.0 ; extra == 's3'
183
- Requires-Dist: s3fs ==2023.9.2 ; extra == 's3'
192
+ Requires-Dist: s3fs <2024.4,>=2023.9.2 ; extra == 's3'
184
193
  Provides-Extra: sqlalchemy
185
194
  Requires-Dist: sqlalchemy ~=1.4 ; extra == 'sqlalchemy'
186
195