From dd82b18be74058e4ce4bf0113f65bc32e63e3d4c Mon Sep 17 00:00:00 2001 From: Grigory Panov Date: Thu, 27 Aug 2026 16:51:01 +0200 Subject: [PATCH] Publish DBR 18+ environments as both point-release and umbrella folders MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Clusters on the DBR 18 line request the environment either by a specific point release (dbr/18.2.x-scala2.13) or by the bare major (dbr/18.x-scala2.13), depending on client version. Telemetry shows the bare-major form was unpublished and failing for most of them, while the point-release folders serve live successful traffic — so publish both forms rather than one. - dbr_point_releases returns (pointrelease_slugs, umbrella_slug): a folder per live (non-EoS) point release, plus a bare-major umbrella folder generated from the latest live point release (whose databricks-connect minor it pins). - sync_dbr / sync_dbr_ml emit both, fetching each page once. - Additive vs main: adds python/dbr/18.x-{scala2.13,cpu-ml-scala2.13,gpu-ml-scala2.13}; nothing is deleted. EoS point releases stay unpublished; a line with no point-release pages (DBR 19) still falls back to the umbrella page. Discovery is hardened: EoS pages are skipped without ending the probe; leading 404s don't end the list before the first page is found (mirroring discover_serverless); and a transient probe newer than the latest keeps the confirmed point releases but skips the umbrella that run to avoid a downgrade. Co-authored-by: Isaac --- .github/scripts/sync.py | 186 ++++++-- .github/scripts/test_sync.py | 267 ++++++++++++ README.md | 10 +- .../dbr/18.x-cpu-ml-scala2.13/constraints.txt | 399 +++++++++++++++++ .../dbr/18.x-cpu-ml-scala2.13/pyproject.toml | 412 ++++++++++++++++++ .../dbr/18.x-gpu-ml-scala2.13/constraints.txt | 398 +++++++++++++++++ .../dbr/18.x-gpu-ml-scala2.13/pyproject.toml | 411 +++++++++++++++++ python/dbr/18.x-scala2.13/constraints.txt | 254 +++++++++++ python/dbr/18.x-scala2.13/pyproject.toml | 267 ++++++++++++ 9 files changed, 2555 insertions(+), 49 deletions(-) create mode 100644 python/dbr/18.x-cpu-ml-scala2.13/constraints.txt create mode 100644 python/dbr/18.x-cpu-ml-scala2.13/pyproject.toml create mode 100644 python/dbr/18.x-gpu-ml-scala2.13/constraints.txt create mode 100644 python/dbr/18.x-gpu-ml-scala2.13/pyproject.toml create mode 100644 python/dbr/18.x-scala2.13/constraints.txt create mode 100644 python/dbr/18.x-scala2.13/pyproject.toml diff --git a/.github/scripts/sync.py b/.github/scripts/sync.py index a6a6bae..96c4d42 100755 --- a/.github/scripts/sync.py +++ b/.github/scripts/sync.py @@ -286,63 +286,131 @@ def discover_dbr(ml=False): return out -def dbr_point_releases(index_slug, ml=False, max_minor=10): - """Expand an index slug into the concrete page slugs to generate a folder for. - - DBR changed its versioning scheme at 18: the index links a single umbrella slug - ('18' / '18ml', titled 'Databricks Runtime 18 LTS ...') whose point releases live at - their own pages ('18.0', '18.1', '18.2', and the ML '18.0ml' ...). Pre-18 lines keep - the old scheme — the index slug ('17.3lts') is itself the runtime page. - - For a bare-major umbrella slug we probe '.[ml]' for minor 0..max_minor, - stopping after two consecutive 404s (end-of-list), and return the LIVE (non-EoS) ones. - If a bare major has no point-release pages yet (e.g. DBR 19 today), we fall back to the - umbrella slug itself so its folder is still generated. Non-umbrella slugs are returned - as-is when live. Each returned slug is meant to be fed to dbr_meta so the minor is read - from that page's own title rather than defaulted. +def _umbrella_major(index_slug): + """The bare major an umbrella-scheme line's folder is keyed by, or None for the + pre-18 scheme (where the folder minor is read from the page title instead). + + DBR changed its versioning at 18: those index slugs are the bare major ('18', '18ml', + '19', '19ml'), and a cluster addresses the whole line by that bare major in its + ``spark_version`` ('18.x-scala2.13'). So the folder drops the minor to match — even + though the packages, Scala/Python and databricks-connect pin come from the latest live + point release page (see ``dbr_point_releases``). Pre-18 lines ('17.3lts', '16.4lts-ml') + keep the old scheme (the index slug is itself the runtime page) and return None.""" + core = re.sub(r"(lts)?(-?ml)?$", "", index_slug) # 18ml -> 18 ; 17.3lts-ml -> 17.3 + return core if re.fullmatch(r"\d+", core) else None + + +def dbr_point_releases(index_slug, ml=False, max_minor=50): + """Return ``(pointrelease_slugs, umbrella_slug)`` for a runtime line: the page slugs to + generate individual '.x' folders from, and the page the bare-major '.x' + umbrella folder is generated from (or None when there is none, or it isn't safe this run). + + DBR changed its versioning at 18: the index links a bare-major umbrella slug ('18' / + '18ml') whose point releases live at their own pages ('18.0', '18.1', '18.2', ...). + Clusters address such a line either by a specific point release ('18.2.x-...') or by the + bare major ('18.x-...') depending on client version (telemetry shows both in live use), + so we publish BOTH: one folder per live point release, and one bare-major umbrella folder + taken from the LATEST live point release (whose databricks-connect minor it pins). Pre-18 + lines keep the old scheme — the index slug ('17.3lts') is itself the runtime page and has + no umbrella form, so umbrella_slug is None. + + We probe '.[ml]' from minor 0, stopping after two consecutive 404s once a + page has been seen (leading 404s — e.g. a removed old page — don't end the list before a + later release is found); ``max_minor`` is only a runaway backstop set well beyond any + real line's point-release count, not the normal terminator. An EoS point release exists + (retired, not end-of-list), so it is skipped without ending the probe and is not + published. The umbrella comes from the newest live point release, EXCEPT when a probe + newer than that was left indeterminate by a transient error — then umbrella_slug is None + so a flaky run can't downgrade the umbrella, while the point-release folders it did + confirm are still returned. If the whole line is EoS, both are empty. If a bare major has + no point-release pages at all (e.g. DBR 19 today), there are no point-release folders and + the umbrella falls back to the umbrella page itself. Slugs are meant to be fed to dbr_meta. """ - core = re.sub(r"(lts)?(-?ml)?$", "", index_slug) # '18ml'->'18' ; '17.3lts-ml'->'17.3' + major = _umbrella_major(index_slug) suffix = "ml" if ml else "" def live_page(slug): - """(html, ok): html of the page if live (None when 404 or EoS), and ok=False on a - transient fetch error so the caller can distinguish "confirmed absent" from - "couldn't tell". Transient errors (timeout, 5xx) are logged and never mistaken for - a 404, mirroring discover_serverless — a flaky run must not abort the sync or be - read as end-of-list.""" + """Probe one page, returning one of: + 'live' (with html) — a live, non-EoS runtime page. + 'eos' — the page exists but the runtime is end-of-support: skip it, but it is + NOT end-of-list, so keep probing higher minors. + 'absent' — a genuine 404: counts toward the two-consecutive end-of-list break. + 'error' — a transient fetch error (timeout, 5xx): logged and never mistaken for + a 404, mirroring discover_serverless — a flaky run must not abort the + sync or be read as end-of-list.""" try: html = fetch_opt(DBR_PAGE.format(slug=slug)) except Exception as e: print(f" ! dbr [{slug}]: transient fetch error ({e}); skipping (not end-of-list)") - return None, False - if html is None or is_eos(html): - return None, True - return html, True + return "error", None + if html is None: + return "absent", None + if is_eos(html): + return "eos", None + return "live", html - if not re.fullmatch(r"\d+", core): - # Pre-18 scheme: the index slug is the runtime page. Keep it if it's live. - html, _ = live_page(index_slug) - return [index_slug] if html else [] + if not major: + # Pre-18 scheme: the index slug is the runtime page; no umbrella form. + kind, _ = live_page(index_slug) + return ([index_slug], None) if kind == "live" else ([], None) - live, misses = [], 0 + live, transient_minors, saw_page, misses = [], [], False, 0 for minor in range(0, max_minor + 1): - slug = f"{core}.{minor}{suffix}" - html, ok = live_page(slug) - if not ok: - # Transient error: skip this minor without advancing the end-of-list counter. + kind, _ = live_page(f"{major}.{minor}{suffix}") + if kind == "error": + # Record the minor, but don't advance the end-of-list counter (a flaky probe + # is not a confirmed 404). + transient_minors.append(minor) continue - if html is None: + if kind == "eos": + # Retired but present — not end-of-list; skip and keep probing. + saw_page = True + misses = 0 + continue + if kind == "absent": misses += 1 - if misses >= 2: + # Only trailing 404s end the list. Don't honor the break until at least one page + # (live or EoS) has been seen, so leading 404s — e.g. an old point-release page + # that was removed — can't stop the probe before a later live release. Mirrors + # the "require at least one found" guard in discover_serverless. + if saw_page and misses >= 2: break continue + saw_page = True misses = 0 - live.append(slug) + live.append(minor) + if live: - return live - # No point-release pages exist yet (e.g. DBR 19) — fall back to the umbrella page. - html, _ = live_page(index_slug) - return [index_slug] if html else [] + pointrelease_slugs = [f"{major}.{m}{suffix}" for m in live] + latest_minor = live[-1] + if any(t > latest_minor for t in transient_minors): + # A point release newer than our latest was left indeterminate by a transient + # error this run. Regenerating the '.x' umbrella from the older confirmed + # release would silently downgrade the folder a bare-major spark_version serves, + # so keep the confirmed point-release folders but skip the umbrella — a clean run + # picks up the true latest (the existing umbrella folder stays untouched). + print(f" ! dbr [{major}.x]: a point release newer than {major}.{latest_minor} " + f"was indeterminate (transient error); keeping point releases, skipping " + f"the umbrella to avoid a downgrade") + return pointrelease_slugs, None + return pointrelease_slugs, f"{major}.{latest_minor}{suffix}" + + if transient_minors: + # Nothing was confirmed live, but a probe was indeterminate — we can't be sure the + # line has no point release, so don't fall back to the umbrella page (which could + # generate the folder from the wrong metadata). Skip; a clean run resolves it. + print(f" ! dbr [{major}.x]: no live point release confirmed and a probe was " + f"indeterminate (transient error); skipping this run") + return [], None + if saw_page: + # Point-release pages exist but none are live — the line is fully EoS (retired). + # EoS lines are not published, so don't fall back to the umbrella page (which may + # not yet carry the EoS marker itself). Any folders already published for this line + # are left as-is; pruning retired lines is out of scope (sync only writes). + return [], None + # No point-release page exists at all (e.g. DBR 19 today) — fall back to the umbrella page. + kind, _ = live_page(index_slug) + return ([], index_slug) if kind == "live" else ([], None) def _write_env(key, pkgs, python_version, dbconnect): @@ -357,7 +425,10 @@ def _write_env(key, pkgs, python_version, dbconnect): def sync_dbr(): for index_slug in discover_dbr(): - for slug in dbr_point_releases(index_slug, ml=False): + major = _umbrella_major(index_slug) + pointrelease_slugs, umbrella_slug = dbr_point_releases(index_slug, ml=False) + # The umbrella slug is usually also one of the point releases — fetch each page once. + for slug in dict.fromkeys(pointrelease_slugs + ([umbrella_slug] if umbrella_slug else [])): try: html = fetch(DBR_PAGE.format(slug=slug)) except Exception as e: @@ -369,8 +440,17 @@ def sync_dbr(): print(f" ! dbr [{slug}]: no meta / Python table; skipping") continue key_ver, dbconnect_ver, scalas, python_version = meta - for scala in scalas: - _write_env(f"{key_ver}.x-scala{scala}", pkgs, python_version, dbconnect_ver) + # A live point release publishes its own '.x' folder (pre-18: the whole + # line). The newest live one ALSO publishes the bare-major '.x' umbrella + # that a DBR 18+ cluster's spark_version resolves to — in ADDITION to its own + # folder, so the umbrella page (18.2) yields both '18.2.x' and '18.x'. Both use + # this page's dbconnect_ver (the latest point release's databricks-connect minor). + folder_vers = [key_ver] if slug in pointrelease_slugs else [] + if major and slug == umbrella_slug: + folder_vers.append(major) + for folder_ver in folder_vers: + for scala in scalas: + _write_env(f"{folder_ver}.x-scala{scala}", pkgs, python_version, dbconnect_ver) def ml_variant_pkgs(ml_html, variant): @@ -387,11 +467,17 @@ def ml_variant_pkgs(ml_html, variant): def sync_dbr_ml(): for index_slug in discover_dbr(ml=True): - for slug in dbr_point_releases(index_slug, ml=True): - _sync_dbr_ml_page(slug) + major = _umbrella_major(index_slug) + pointrelease_slugs, umbrella_slug = dbr_point_releases(index_slug, ml=True) + for slug in dict.fromkeys(pointrelease_slugs + ([umbrella_slug] if umbrella_slug else [])): + _sync_dbr_ml_page( + slug, + point_release=slug in pointrelease_slugs, + umbrella_major=major if slug == umbrella_slug else None, + ) -def _sync_dbr_ml_page(slug): +def _sync_dbr_ml_page(slug, point_release, umbrella_major): base = re.sub(r"-?ml$", "", slug) # 18.2ml -> 18.2 ; 17.3lts-ml -> 17.3lts ; 19ml -> 19 try: base_html = fetch(DBR_PAGE.format(slug=base)) @@ -404,13 +490,17 @@ def _sync_dbr_ml_page(slug): print(f" ! dbr-ml [{slug}]: no base meta from {base}; skipping") return key_ver, dbconnect_ver, scalas, python_version = meta + # A live point release publishes its own '.x' ML folders; the newest one also + # publishes the bare-major '.x' ML umbrella (DBR 18+). Both share dbconnect_ver. + folder_vers = ([key_ver] if point_release else []) + ([umbrella_major] if umbrella_major else []) for variant in ("cpu", "gpu"): pkgs = ml_variant_pkgs(ml_html, variant) if not pkgs: print(f" ! dbr-ml [{slug}] {variant}: no packages found; skipping") continue - for scala in scalas: - _write_env(f"{key_ver}.x-{variant}-ml-scala{scala}", pkgs, python_version, dbconnect_ver) + for folder_ver in folder_vers: + for scala in scalas: + _write_env(f"{folder_ver}.x-{variant}-ml-scala{scala}", pkgs, python_version, dbconnect_ver) def git(*args): diff --git a/.github/scripts/test_sync.py b/.github/scripts/test_sync.py index f32d041..ab80aec 100644 --- a/.github/scripts/test_sync.py +++ b/.github/scripts/test_sync.py @@ -1,6 +1,8 @@ """Unit tests for sync.py page-parsing (run: python -m unittest test_sync).""" import unittest +from unittest import mock +import sync from sync import dbr_meta, dbr_scalas # Minimal fragments mirroring the runtime pages' System environment list. The real @@ -83,5 +85,270 @@ def test_none_when_scala_missing(self): self.assertIsNone(dbr_meta("Databricks Runtime 19")) +def _titled_page(title): + """Minimal page carrying only a — enough for is_eos / dbr_point_releases, + which key off the title and never parse the body of a probe page.""" + return f"<title>{title} | Databricks on AWS" + + +def _runtime_page(title, scala="2.13", python="3.12.3", pkgs=(("numpy", "2.1.3"),)): + """A standard runtime page with the fields dbr_meta / parse_dbr_page read: a + , a System-environment Scala/Python list, and an Installed Python libraries + table.""" + rows = "".join(f"<td><p>{n}<td><p>{v}" for n, v in pkgs) + return ( + f"<title>{title} | Databricks on AWS" + f"
  • Scala: {scala}.16
  • " + f"
  • Python: {python}
  • " + '

    Installed Python libraries

    ' + f"{rows}
    " + ) + + +def _ml_page(pkgs=(("numpy", "2.1.3"),)): + """An ML runtime page rendering the CPU and GPU library tables inline.""" + rows = "".join(f"

    {n}

    {v}" for n, v in pkgs) + return ( + '

    CPU

    ' + f"{rows}
    " + '

    GPU

    ' + f"{rows}
    " + ) + + +def _slug_of(url): + """The runtime slug (last path segment) of a DBR_PAGE URL.""" + return url.rstrip("/").rsplit("/", 1)[-1] + + +def _fake_fetch(pages): + """A fetch() replacement serving `pages` (slug -> html); KeyError on a miss so a + test that requests an unexpected page fails loudly rather than silently.""" + return lambda url: pages[_slug_of(url)] + + +def _fake_fetch_opt(pages): + """A fetch_opt() replacement: html for a known slug, None (a 404) otherwise.""" + return lambda url: pages.get(_slug_of(url)) + + +class UmbrellaMajorTest(unittest.TestCase): + def test_bare_major_lines_are_umbrella(self): + # DBR 18+ index slugs are the bare major; clusters address the line by that + # bare major in spark_version, so its folder is keyed by the major. + self.assertEqual(sync._umbrella_major("18"), "18") + self.assertEqual(sync._umbrella_major("18ml"), "18") + self.assertEqual(sync._umbrella_major("19"), "19") + self.assertEqual(sync._umbrella_major("19ml"), "19") + + def test_pre18_lts_lines_are_not_umbrella(self): + # Pre-18 lines keep the old scheme: the minor is read from the page title, so + # they are not umbrella-keyed. + self.assertIsNone(sync._umbrella_major("17.3lts")) + self.assertIsNone(sync._umbrella_major("17.3lts-ml")) + self.assertIsNone(sync._umbrella_major("16.4lts")) + + +class DbrPointReleasesTest(unittest.TestCase): + def test_umbrella_returns_all_live_point_releases_plus_latest_as_umbrella(self): + # DBR 18: 18.0 EoS (skipped), 18.1 and 18.2 live. Both live point releases get their + # own folder, and the latest (18.2) also sources the bare-major umbrella — clusters + # address the line by either form depending on client version, so we publish both. + pages = { + "18.0": _titled_page("Databricks Runtime 18.0 (EoS)"), + "18.1": _titled_page("Databricks Runtime 18.1"), + "18.2": _titled_page("Databricks Runtime 18.2"), + } + with mock.patch.object(sync, "fetch_opt", _fake_fetch_opt(pages)): + self.assertEqual(sync.dbr_point_releases("18"), (["18.1", "18.2"], "18.2")) + + def test_umbrella_ml_returns_all_live_point_releases_plus_latest(self): + pages = { + "18.1ml": _titled_page("Databricks Runtime 18.1 ML"), + "18.2ml": _titled_page("Databricks Runtime 18.2 ML"), + } + with mock.patch.object(sync, "fetch_opt", _fake_fetch_opt(pages)): + self.assertEqual( + sync.dbr_point_releases("18ml", ml=True), (["18.1ml", "18.2ml"], "18.2ml") + ) + + def test_umbrella_falls_back_to_umbrella_page_when_no_point_releases(self): + # DBR 19 today: no point-release pages, so there are no per-minor folders and the + # umbrella is taken from the umbrella page itself. + pages = {"19": _titled_page("Databricks Runtime 19")} + with mock.patch.object(sync, "fetch_opt", _fake_fetch_opt(pages)): + self.assertEqual(sync.dbr_point_releases("19"), ([], "19")) + + def test_pre18_returns_index_slug_and_no_umbrella(self): + pages = {"17.3lts": _titled_page("Databricks Runtime 17.3 LTS")} + with mock.patch.object(sync, "fetch_opt", _fake_fetch_opt(pages)): + self.assertEqual(sync.dbr_point_releases("17.3lts"), (["17.3lts"], None)) + + def test_umbrella_keeps_point_releases_but_skips_umbrella_when_newest_indeterminate(self): + # A transient error on a release NEWER than the newest confirmed live one leaves the + # true latest unknown. Keep the confirmed point-release folder(s), but skip the + # umbrella (umbrella_slug=None) so a flaky run can't downgrade the folder that a + # bare-major spark_version serves. + def fetch_opt(url): + slug = _slug_of(url) + if slug == "18.2": + raise TimeoutError("transient") + return { + "18.0": _titled_page("Databricks Runtime 18.0 (EoS)"), + "18.1": _titled_page("Databricks Runtime 18.1"), + }.get(slug) + + with mock.patch.object(sync, "fetch_opt", fetch_opt): + self.assertEqual(sync.dbr_point_releases("18"), (["18.1"], None)) + + def test_umbrella_probes_beyond_a_low_minor_cap(self): + # A long-lived line accrues many point releases; the trailing-404 break — not an + # arbitrary low minor cap — ends discovery, so every live one is returned and the + # umbrella tracks the true latest (18.12). + pages = {f"18.{m}": _titled_page(f"Databricks Runtime 18.{m}") for m in range(13)} + with mock.patch.object(sync, "fetch_opt", _fake_fetch_opt(pages)): + self.assertEqual( + sync.dbr_point_releases("18"), ([f"18.{m}" for m in range(13)], "18.12") + ) + + def test_umbrella_sole_live_release_is_both_point_release_and_umbrella(self): + pages = {"18.0": _titled_page("Databricks Runtime 18.0")} + with mock.patch.object(sync, "fetch_opt", _fake_fetch_opt(pages)): + self.assertEqual(sync.dbr_point_releases("18"), (["18.0"], "18.0")) + + def test_umbrella_publishes_nothing_for_a_fully_eos_line(self): + # Every point release is EoS (retired), even though the umbrella page isn't marked + # EoS yet: publish nothing — neither point-release folders nor the umbrella. + pages = { + "18.0": _titled_page("Databricks Runtime 18.0 (EoS)"), + "18.1": _titled_page("Databricks Runtime 18.1 (EoS)"), + "18": _titled_page("Databricks Runtime 18 LTS"), # umbrella not yet EoS + } + with mock.patch.object(sync, "fetch_opt", _fake_fetch_opt(pages)): + self.assertEqual(sync.dbr_point_releases("18"), ([], None)) + + def test_umbrella_probes_past_leading_404s_to_a_later_live_release(self): + # If the earliest point-release pages are genuinely absent (e.g. removed), the two + # consecutive 404s must NOT be read as end-of-list before any page is found — a + # later live release (18.2/18.3) must still be discovered. Mirrors the "require at + # least one found before honoring the break" guard in discover_serverless. + pages = { + "18.2": _titled_page("Databricks Runtime 18.2"), + "18.3": _titled_page("Databricks Runtime 18.3"), + } + with mock.patch.object(sync, "fetch_opt", _fake_fetch_opt(pages)): + self.assertEqual(sync.dbr_point_releases("18"), (["18.2", "18.3"], "18.3")) + + def test_umbrella_probes_past_eos_point_releases_to_the_live_latest(self): + # Consecutive EoS releases must not stop the probe before a later live one. + pages = { + "18.0": _titled_page("Databricks Runtime 18.0 (EoS)"), + "18.1": _titled_page("Databricks Runtime 18.1 (EoS)"), + "18.2": _titled_page("Databricks Runtime 18.2"), + } + with mock.patch.object(sync, "fetch_opt", _fake_fetch_opt(pages)): + self.assertEqual(sync.dbr_point_releases("18"), (["18.2"], "18.2")) + + def test_umbrella_publishes_nothing_when_none_live_and_a_probe_indeterminate(self): + # No release confirmed live, but a probe hit a transient error — we can't be sure the + # line has no point release, so don't fall back to the umbrella page (wrong metadata). + def fetch_opt(url): + slug = _slug_of(url) + if slug == "20.0": + raise TimeoutError("transient") + return {"20": _titled_page("Databricks Runtime 20 LTS")}.get(slug) + + with mock.patch.object(sync, "fetch_opt", fetch_opt): + self.assertEqual(sync.dbr_point_releases("20"), ([], None)) + + def test_umbrella_ignores_transient_below_the_latest_live_release(self): + # A transient error OLDER than the confirmed latest can't change which is newest; the + # umbrella still comes from the latest and the confirmed point releases are returned. + def fetch_opt(url): + slug = _slug_of(url) + if slug == "18.1": + raise TimeoutError("transient") + return { + "18.0": _titled_page("Databricks Runtime 18.0"), + "18.2": _titled_page("Databricks Runtime 18.2"), + }.get(slug) + + with mock.patch.object(sync, "fetch_opt", fetch_opt): + self.assertEqual(sync.dbr_point_releases("18"), (["18.0", "18.2"], "18.2")) + + +class SyncDbrFolderKeyTest(unittest.TestCase): + def test_umbrella_line_publishes_point_releases_and_the_bare_major_umbrella(self): + # DBR 18: each live point release gets its own folder (keyed by its minor), and the + # latest also produces the bare-major umbrella folder clusters request as 18.x. + # Telemetry shows both naming forms are in live use, so we publish both. + pages = { + "18.1": _runtime_page("Databricks Runtime 18.1"), + "18.2": _runtime_page("Databricks Runtime 18.2"), + } + writes, fetched = [], [] + base_fetch = _fake_fetch(pages) + + def counting_fetch(url): + fetched.append(_slug_of(url)) + return base_fetch(url) + + with mock.patch.object(sync, "discover_dbr", return_value=["18"]), \ + mock.patch.object(sync, "dbr_point_releases", + return_value=(["18.1", "18.2"], "18.2")), \ + mock.patch.object(sync, "fetch", counting_fetch), \ + mock.patch.object(sync, "_write_env", + lambda key, pkgs, pv, dbconnect: writes.append((key, dbconnect))): + sync.sync_dbr() + self.assertEqual( + sorted(writes), + [("18.1.x-scala2.13", "18.1"), + ("18.2.x-scala2.13", "18.2"), + ("18.x-scala2.13", "18.2")], + ) + # 18.2 is both a point release and the umbrella source, but is fetched only once. + self.assertEqual(sorted(fetched), ["18.1", "18.2"]) + + def test_pre18_line_publishes_only_its_minor_folder(self): + # Regression guard: pre-18 lines are unaffected — one folder, keyed by the minor + # from the page title, and no bare-major umbrella. + pages = {"17.3lts": _runtime_page("Databricks Runtime 17.3 LTS")} + writes = [] + with mock.patch.object(sync, "discover_dbr", return_value=["17.3lts"]), \ + mock.patch.object(sync, "dbr_point_releases", return_value=(["17.3lts"], None)), \ + mock.patch.object(sync, "fetch", _fake_fetch(pages)), \ + mock.patch.object(sync, "_write_env", + lambda key, pkgs, pv, dbconnect: writes.append((key, dbconnect))): + sync.sync_dbr() + self.assertEqual(writes, [("17.3.x-scala2.13", "17.3")]) + + +class SyncDbrMlFolderKeyTest(unittest.TestCase): + def test_umbrella_ml_line_publishes_point_releases_and_umbrella(self): + pages = { + "18.1": _runtime_page("Databricks Runtime 18.1"), # base pages for meta + "18.2": _runtime_page("Databricks Runtime 18.2"), + "18.1ml": _ml_page(), + "18.2ml": _ml_page(), + } + writes = [] + with mock.patch.object(sync, "discover_dbr", return_value=["18ml"]), \ + mock.patch.object(sync, "dbr_point_releases", + return_value=(["18.1ml", "18.2ml"], "18.2ml")), \ + mock.patch.object(sync, "fetch", _fake_fetch(pages)), \ + mock.patch.object(sync, "_write_env", + lambda key, pkgs, pv, dbconnect: writes.append((key, dbconnect))): + sync.sync_dbr_ml() + self.assertEqual( + sorted(writes), + [("18.1.x-cpu-ml-scala2.13", "18.1"), + ("18.1.x-gpu-ml-scala2.13", "18.1"), + ("18.2.x-cpu-ml-scala2.13", "18.2"), + ("18.2.x-gpu-ml-scala2.13", "18.2"), + ("18.x-cpu-ml-scala2.13", "18.2"), + ("18.x-gpu-ml-scala2.13", "18.2")], + ) + + if __name__ == "__main__": unittest.main() diff --git a/README.md b/README.md index 373c9a1..9f0b8fb 100644 --- a/README.md +++ b/README.md @@ -110,7 +110,15 @@ is best-effort. Nobody hand-edits the `python/` artifacts. [runtime release-notes index](https://docs.databricks.com/aws/en/release-notes/runtime/), then for each fetches the page and parses the "Installed Python libraries" HTML table. The repo key (`.x-scala`) is built from the page's title and the - Scala version in its System environment. A release that ships two Scala images from + Scala version in its System environment. From DBR 18 the release notes use an umbrella + scheme — a bare-major page (`Databricks Runtime 18 LTS`) with separate point-release + pages (`18.0`, `18.1`, …) — and a cluster addresses the line either by a specific point + release (`18.2.x-scala2.13`) or by the bare major (`18.x-scala2.13`) depending on client + version, so both forms are published: one folder per live point release, plus a + bare-major umbrella folder taken from the latest live point release (whose minor sets the + `databricks-connect` pin). EoS point releases are skipped. Pre-18 lines keep the old + scheme — one folder, keyed by the minor read from the page title. A release that + ships two Scala images from one page (e.g. DBR 16.4 LTS — `Scala: 2.12.15 or 2.13.10`) yields one environment per Scala version (`…-scala2.12` and `…-scala2.13`), both off the page's single Python library table. DBR pages don't list `databricks-connect`, so its dev pin is derived diff --git a/python/dbr/18.x-cpu-ml-scala2.13/constraints.txt b/python/dbr/18.x-cpu-ml-scala2.13/constraints.txt new file mode 100644 index 0000000..76fe84c --- /dev/null +++ b/python/dbr/18.x-cpu-ml-scala2.13/constraints.txt @@ -0,0 +1,399 @@ +# constraints.txt file for Databricks Runtime 18.x-cpu-ml-scala2.13 + +absl-py~=2.3.1 +accelerate~=1.11.0 +aiohappyeyeballs~=2.4.4 +aiohttp~=3.11.10 +aiohttp-cors~=0.8.1 +aiosignal~=1.2.0 +alembic~=1.17.1 +annotated-doc~=0.0.4 +annotated-types~=0.7.0 +anyio~=4.7.0 +argon2-cffi~=21.3.0 +argon2-cffi-bindings~=21.2.0 +arro3-core~=0.6.5 +arrow~=1.3.0 +asttokens~=3.0.0 +astunparse~=1.6.3 +async-lru~=2.0.4 +attrs~=24.3.0 +audioread~=3.1.0 +azure-common~=1.1.28 +azure-core~=1.36.0 +azure-cosmos~=4.3.1 +azure-identity~=1.20.0 +azure-mgmt-core~=1.6.0 +azure-mgmt-web~=8.0.0 +azure-storage-blob~=12.27.1 +azure-storage-file-datalake~=12.22.0 +babel~=2.16.0 +bcrypt~=4.3.0 +beautifulsoup4~=4.12.3 +black~=24.10.0 +bleach~=6.2.0 +blinker~=1.7.0 +blis~=0.7.11 +boto3~=1.40.45 +botocore~=1.40.45 +brotli~=1.2.0 +cachetools~=5.5.1 +catalogue~=2.0.10 +certifi~=2025.4.26 +cffi~=1.17.1 +chardet~=4.0.0 +charset-normalizer~=3.3.2 +circuitbreaker~=2.1.3 +click~=8.1.8 +cloudpathlib~=0.23.0 +cloudpickle~=3.0.0 +cmdstanpy~=1.3.0 +colorful~=0.5.8 +colorlog~=6.10.1 +comm~=0.2.1 +confection~=0.1.5 +contourpy~=1.3.1 +cramjam~=2.11.0 +cryptography~=44.0.1 +cycler~=0.11.0 +cymem~=2.0.12 +cython~=3.1.5 +dacite~=1.9.2 +databricks-agents~=1.9.1 +databricks-feature-engineering~=0.13.0.1 +databricks-sdk~=0.67 +dataclasses-json~=0.6.7 +datasets~=4.3.0 +dbl-tempo~=0.1.26 +debugpy~=1.8.11 +decorator~=5.1.1 +defusedxml~=0.7.1 +deltalake~=1.1.4 +deprecated~=1.2.18 +dill~=0.3.8 +distlib~=0.3.9 +distro~=1.9.0 +dm-tree~=0.1.9 +docstring-to-markdown~=0.11 +einops~=0.8.1 +evaluate~=0.4.6 +executing~=1.2.0 +facets-overview~=1.1.1 +farama-notifications~=0.0.4 +fastapi~=0.121.2 +fastjsonschema~=2.21.1 +filelock~=3.17.0 +filetype~=1.2.0 +flask~=2.2.5 +flatbuffers~=25.9.23 +fonttools~=4.55.3 +fqdn~=1.5.1 +frozenlist~=1.5.0 +fsspec~=2023.5.0 +gast~=0.6.0 +gitdb~=4.0.11 +gitpython~=3.1.43 +google-api-core~=2.28.1 +google-auth~=2.43.0 +google-cloud-core~=2.5.0 +google-cloud-storage~=3.2.0 +google-crc32c~=1.7.1 +google-pasta~=0.2.0 +google-resumable-media~=2.7.2 +googleapis-common-protos~=1.65.0 +graphql-core~=3.2.4 +greenlet~=3.1.1 +grpcio~=1.67 +grpcio-status~=1.67 +gymnasium~=0.28.1 +h11~=0.16.0 +h5py~=3.12.1 +hf-xet~=1.2.0 +hjson~=3.1.0 +holidays~=0.54 +httpcore~=1.0.9 +httplib2~=0.20.4 +httpx~=0.28.1 +huggingface-hub~=0.36.0 +idna~=3.7 +imagehash~=4.3.1 +imageio~=2.37.0 +imbalanced-learn~=0.13.0 +importlib-metadata~=8.5.0 +iniconfig~=1.1.1 +ipyflow-core~=0.0.209 +ipykernel~=6.29.5 +ipython~=8.30.0 +ipython-genutils~=0.2.0 +ipywidgets~=7.8.1 +isodate~=0.7.2 +isoduration~=20.11.0 +itsdangerous~=2.2.0 +jax-jumpy~=1.0.0 +jedi~=0.19.2 +jinja2~=3.1.6 +jiter~=0.12.0 +jmespath~=1.0.1 +joblib~=1.4.2 +joblibspark~=0.6.0 +json5~=0.9.25 +jsonpatch~=1.33 +jsonpointer~=3.0.0 +jsonschema~=4.23.0 +jsonschema-specifications~=2023.7.1 +jupyter~=1.1.1 +jupyter-client~=8.6.3 +jupyter-console~=6.6.3 +jupyter-core~=5.7.2 +jupyter-events~=0.12.0 +jupyter-lsp~=2.2.5 +jupyter-server~=2.15.0 +jupyter-server-terminals~=0.5.3 +jupyterlab~=4.3.4 +jupyterlab-pygments~=0.3.0 +jupyterlab-server~=2.27.3 +jupyterlab-widgets~=1.1.11 +keras~=3.12.0 +kiwisolver~=1.4.8 +langchain~=1.0.3 +langchain-core~=1.0.4 +langchain-openai~=1.0.2 +langcodes~=3.5.0 +langgraph~=1.0.3 +langgraph-checkpoint~=3.0.1 +langgraph-prebuilt~=1.0.4 +langgraph-sdk~=0.2.9 +langsmith~=0.4.41 +language-data~=1.3.0 +launchpadlib~=1.11.0 +lazr-restfulclient~=0.14.6 +lazr-uri~=1.0.6 +lazy-loader~=0.4 +libclang~=15.0.6.1 +librosa~=0.11.0 +lightgbm~=4.6.0 +linkify-it-py~=2.0.0 +litellm~=1.75.9 +llvmlite~=0.44.0 +lz4~=4.3.2 +mako~=1.3.10 +marisa-trie~=1.2.0 +markdown~=3.8 +markdown-it-py~=2.2.0 +markupsafe~=3.0.2 +marshmallow~=3.26.1 +matplotlib~=3.10.0 +matplotlib-inline~=0.1.7 +mccabe~=0.7.0 +mdit-py-plugins~=0.3.0 +mdurl~=0.1.0 +memray~=1.19.1 +minify-html~=0.18.1 +mistune~=3.1.2 +ml-dtypes~=0.5.3 +mlflow-skinny~=3.8.1 +mmh3~=5.2.0 +mosaicml-streaming~=0.13.0 +mpmath~=1.3.0 +msal~=1.34.0 +msal-extensions~=1.3.1 +msgpack~=1.1.2 +multidict~=6.1.0 +multimethod~=1.12 +multiprocess~=0.70.16 +murmurhash~=1.0.14 +mypy-extensions~=1.0.0 +namex~=0.1.0 +nbclient~=0.10.2 +nbconvert~=7.16.6 +nbformat~=5.10.4 +nest-asyncio~=1.6.0 +networkx~=3.4.2 +ninja~=1.13.0 +nltk~=3.9.1 +nodeenv~=1.9.1 +notebook~=7.3.2 +notebook-shim~=0.2.4 +numba~=0.61.0 +numpy~=2.1.3 +oauthlib~=3.2.0 +oci~=2.163.1 +openai~=2.7.0 +opencensus~=0.11.4 +opencensus-context~=0.1.3 +opentelemetry-api~=1.38.0 +opentelemetry-proto~=1.38.0 +opentelemetry-sdk~=1.38.0 +opentelemetry-semantic-conventions~=0.59b0 +opt-einsum~=3.4.0 +optree~=0.17.0 +optuna~=3.6.1 +optuna-integration~=3.6.0 +orjson~=3.11.4 +ormsgpack~=1.12.0 +overrides~=7.4.0 +packaging~=24.2 +pandas~=2.2.3 +pandocfilters~=1.5.0 +paramiko~=3.5.1 +parso~=0.8.4 +pathspec~=0.10.3 +patsy~=1.0.1 +pexpect~=4.8.0 +phik~=0.12.5 +pillow~=11.1.0 +platformdirs~=4.3.7 +plotly~=5.24.1 +pluggy~=1.5.0 +pooch~=1.8.2 +preshed~=3.0.11 +prometheus-client~=0.21.1 +prompt-toolkit~=3.0.43 +propcache~=0.3.1 +prophet~=1.2.1 +proto-plus~=1.26.1 +protobuf~=5.29.4 +psutil~=5.9.0 +psycopg2~=2.9.11 +ptyprocess~=0.7.0 +pure-eval~=0.2.2 +puremagic~=1.30 +py-cpuinfo~=9.0.0 +py-spy~=0.4.1 +pyarrow~=21.0.0 +pyasn1~=0.4.8 +pyasn1-modules~=0.2.8 +pyccolo~=0.0.71 +pycparser~=2.21 +pydantic~=2.10.6 +pydantic-core~=2.27.2 +pyflakes~=3.2.0 +pygments~=2.19.1 +pyiceberg~=0.10.0 +pyjwt~=2.10.1 +pynacl~=1.5.0 +pyodbc~=5.2.0 +pyopenssl~=25.0.0 +pyparsing~=3.2.0 +pyright~=1.1.394 +pyroaring~=1.0.3 +pytesseract~=0.3.10 +pytest~=8.3.5 +python-dateutil~=2.9.0.post0 +python-dotenv~=1.2.1 +python-editor~=1.0.4 +python-json-logger~=3.2.1 +python-lsp-jsonrpc~=1.1.2 +python-lsp-server~=1.12.2 +python-snappy~=0.7.3 +pytoolconfig~=1.2.6 +pytz~=2024.1 +pywavelets~=1.8.0 +pyyaml~=6.0.2 +pyzmq~=26.2.0 +ray~=2.37.0 +referencing~=0.30.2 +regex~=2024.11.6 +requests~=2.32.3 +requests-toolbelt~=1.0.0 +rfc3339-validator~=0.1.4 +rfc3986-validator~=0.1.1 +rich~=13.9.4 +rope~=1.13.0 +rpds-py~=0.22.3 +rsa~=4.9.1 +s3transfer~=0.14.0 +safetensors~=0.6.2 +scikit-image~=0.25.0 +scikit-learn~=1.6.1 +scipy~=1.15.3 +seaborn~=0.13.2 +send2trash~=1.8.2 +sentence-transformers~=5.1.2 +sentencepiece~=0.2.1 +setuptools~=78.1.1 +shap~=0.49.1 +shellingham~=1.5.4 +six~=1.17.0 +sklearn-compat~=0.1.3 +slicer~=0.0.8 +smart-open~=7.5.0 +smmap~=5.0.0 +sniffio~=1.3.0 +sortedcontainers~=2.4.0 +soundfile~=0.13.1 +soupsieve~=2.5 +soxr~=1.0.0 +spacy~=3.7.5 +spacy-legacy~=3.0.12 +spacy-loggers~=1.0.5 +sqlalchemy~=2.0.39 +sqlparse~=0.5.3 +srsly~=2.5.1 +ssh-import-id~=5.11 +stack-data~=0.6.3 +stanio~=0.5.1 +starlette~=0.49.3 +statsmodels~=0.14.4 +strictyaml~=1.7.3 +sympy~=1.13.3 +tenacity~=9.0.0 +tensorboard~=2.20.0 +tensorboard-data-server~=0.7.2 +tensorboardx~=2.6.4 +tensorflow~=2.20.0 +termcolor~=3.2.0 +terminado~=0.17.1 +textual~=4.0.0 +tf-keras~=2.20.1 +thinc~=8.2.4 +threadpoolctl~=3.5.0 +tifffile~=2025.2.18 +tiktoken~=0.9.0 +tinycss2~=1.4.0 +tokenize-rt~=6.1.0 +tokenizers~=0.22.1 +tomli~=2.0.1 +torch~=2.9.0 +torcheval~=0.0.7 +torchvision~=0.24.0 +tornado~=6.5.1 +tqdm~=4.67.1 +traitlets~=5.14.3 +transformers~=4.57.1 +typer~=0.20.0 +typer-slim~=0.20.0 +types-python-dateutil~=2.9.0.20251108 +typing-extensions~=4.12.2 +typing-inspect~=0.9.0 +tzdata~=2024.1 +uc-micro-py~=1.0.1 +ujson~=5.10.0 +uri-template~=1.3.0 +urllib3~=2.3.0 +uvicorn~=0.38.0 +virtualenv~=20.29.3 +visions~=0.8.1 +wadllib~=1.3.6 +wasabi~=1.1.3 +wcwidth~=0.2.5 +weasel~=0.4.3 +webcolors~=25.10.0 +webencodings~=0.5.1 +websocket-client~=1.8.0 +werkzeug~=3.1.3 +whatthepatch~=1.0.2 +wheel~=0.45.1 +whenever~=0.7.3 +widgetsnbextension~=3.6.6 +wordcloud~=1.9.4 +wrapt~=1.17.0 +xgboost~=3.1.1 +xgboost-ray~=0.1.19 +xxhash~=3.5.0 +yapf~=0.40.2 +yarl~=1.18.0 +ydata-profiling~=4.17.0 +zipp~=3.21.0 +zstandard~=0.23.0 +zstd~=1.5.5.1 diff --git a/python/dbr/18.x-cpu-ml-scala2.13/pyproject.toml b/python/dbr/18.x-cpu-ml-scala2.13/pyproject.toml new file mode 100644 index 0000000..02d0379 --- /dev/null +++ b/python/dbr/18.x-cpu-ml-scala2.13/pyproject.toml @@ -0,0 +1,412 @@ +# pyproject.toml file for Databricks Runtime 18.x-cpu-ml-scala2.13 + +[project] +name = "constraint-env-18-x-cpu-ml-scala2-13" +version = "0.1.0" +requires-python = "==3.12.*" + +[dependency-groups] +dev = [ + "databricks-connect~=18.2.0", +] + +[tool.uv] +constraint-dependencies = [ + "absl-py~=2.3.1", + "accelerate~=1.11.0", + "aiohappyeyeballs~=2.4.4", + "aiohttp~=3.11.10", + "aiohttp-cors~=0.8.1", + "aiosignal~=1.2.0", + "alembic~=1.17.1", + "annotated-doc~=0.0.4", + "annotated-types~=0.7.0", + "anyio~=4.7.0", + "argon2-cffi~=21.3.0", + "argon2-cffi-bindings~=21.2.0", + "arro3-core~=0.6.5", + "arrow~=1.3.0", + "asttokens~=3.0.0", + "astunparse~=1.6.3", + "async-lru~=2.0.4", + "attrs~=24.3.0", + "audioread~=3.1.0", + "azure-common~=1.1.28", + "azure-core~=1.36.0", + "azure-cosmos~=4.3.1", + "azure-identity~=1.20.0", + "azure-mgmt-core~=1.6.0", + "azure-mgmt-web~=8.0.0", + "azure-storage-blob~=12.27.1", + "azure-storage-file-datalake~=12.22.0", + "babel~=2.16.0", + "bcrypt~=4.3.0", + "beautifulsoup4~=4.12.3", + "black~=24.10.0", + "bleach~=6.2.0", + "blinker~=1.7.0", + "blis~=0.7.11", + "boto3~=1.40.45", + "botocore~=1.40.45", + "brotli~=1.2.0", + "cachetools~=5.5.1", + "catalogue~=2.0.10", + "certifi~=2025.4.26", + "cffi~=1.17.1", + "chardet~=4.0.0", + "charset-normalizer~=3.3.2", + "circuitbreaker~=2.1.3", + "click~=8.1.8", + "cloudpathlib~=0.23.0", + "cloudpickle~=3.0.0", + "cmdstanpy~=1.3.0", + "colorful~=0.5.8", + "colorlog~=6.10.1", + "comm~=0.2.1", + "confection~=0.1.5", + "contourpy~=1.3.1", + "cramjam~=2.11.0", + "cryptography~=44.0.1", + "cycler~=0.11.0", + "cymem~=2.0.12", + "cython~=3.1.5", + "dacite~=1.9.2", + "databricks-agents~=1.9.1", + "databricks-feature-engineering~=0.13.0.1", + "databricks-sdk~=0.67", + "dataclasses-json~=0.6.7", + "datasets~=4.3.0", + "dbl-tempo~=0.1.26", + "debugpy~=1.8.11", + "decorator~=5.1.1", + "defusedxml~=0.7.1", + "deltalake~=1.1.4", + "deprecated~=1.2.18", + "dill~=0.3.8", + "distlib~=0.3.9", + "distro~=1.9.0", + "dm-tree~=0.1.9", + "docstring-to-markdown~=0.11", + "einops~=0.8.1", + "evaluate~=0.4.6", + "executing~=1.2.0", + "facets-overview~=1.1.1", + "farama-notifications~=0.0.4", + "fastapi~=0.121.2", + "fastjsonschema~=2.21.1", + "filelock~=3.17.0", + "filetype~=1.2.0", + "flask~=2.2.5", + "flatbuffers~=25.9.23", + "fonttools~=4.55.3", + "fqdn~=1.5.1", + "frozenlist~=1.5.0", + "fsspec~=2023.5.0", + "gast~=0.6.0", + "gitdb~=4.0.11", + "gitpython~=3.1.43", + "google-api-core~=2.28.1", + "google-auth~=2.43.0", + "google-cloud-core~=2.5.0", + "google-cloud-storage~=3.2.0", + "google-crc32c~=1.7.1", + "google-pasta~=0.2.0", + "google-resumable-media~=2.7.2", + "googleapis-common-protos~=1.65.0", + "graphql-core~=3.2.4", + "greenlet~=3.1.1", + "grpcio~=1.67", + "grpcio-status~=1.67", + "gymnasium~=0.28.1", + "h11~=0.16.0", + "h5py~=3.12.1", + "hf-xet~=1.2.0", + "hjson~=3.1.0", + "holidays~=0.54", + "httpcore~=1.0.9", + "httplib2~=0.20.4", + "httpx~=0.28.1", + "huggingface-hub~=0.36.0", + "idna~=3.7", + "imagehash~=4.3.1", + "imageio~=2.37.0", + "imbalanced-learn~=0.13.0", + "importlib-metadata~=8.5.0", + "iniconfig~=1.1.1", + "ipyflow-core~=0.0.209", + "ipykernel~=6.29.5", + "ipython~=8.30.0", + "ipython-genutils~=0.2.0", + "ipywidgets~=7.8.1", + "isodate~=0.7.2", + "isoduration~=20.11.0", + "itsdangerous~=2.2.0", + "jax-jumpy~=1.0.0", + "jedi~=0.19.2", + "jinja2~=3.1.6", + "jiter~=0.12.0", + "jmespath~=1.0.1", + "joblib~=1.4.2", + "joblibspark~=0.6.0", + "json5~=0.9.25", + "jsonpatch~=1.33", + "jsonpointer~=3.0.0", + "jsonschema~=4.23.0", + "jsonschema-specifications~=2023.7.1", + "jupyter~=1.1.1", + "jupyter-client~=8.6.3", + "jupyter-console~=6.6.3", + "jupyter-core~=5.7.2", + "jupyter-events~=0.12.0", + "jupyter-lsp~=2.2.5", + "jupyter-server~=2.15.0", + "jupyter-server-terminals~=0.5.3", + "jupyterlab~=4.3.4", + "jupyterlab-pygments~=0.3.0", + "jupyterlab-server~=2.27.3", + "jupyterlab-widgets~=1.1.11", + "keras~=3.12.0", + "kiwisolver~=1.4.8", + "langchain~=1.0.3", + "langchain-core~=1.0.4", + "langchain-openai~=1.0.2", + "langcodes~=3.5.0", + "langgraph~=1.0.3", + "langgraph-checkpoint~=3.0.1", + "langgraph-prebuilt~=1.0.4", + "langgraph-sdk~=0.2.9", + "langsmith~=0.4.41", + "language-data~=1.3.0", + "launchpadlib~=1.11.0", + "lazr-restfulclient~=0.14.6", + "lazr-uri~=1.0.6", + "lazy-loader~=0.4", + "libclang~=15.0.6.1", + "librosa~=0.11.0", + "lightgbm~=4.6.0", + "linkify-it-py~=2.0.0", + "litellm~=1.75.9", + "llvmlite~=0.44.0", + "lz4~=4.3.2", + "mako~=1.3.10", + "marisa-trie~=1.2.0", + "markdown~=3.8", + "markdown-it-py~=2.2.0", + "markupsafe~=3.0.2", + "marshmallow~=3.26.1", + "matplotlib~=3.10.0", + "matplotlib-inline~=0.1.7", + "mccabe~=0.7.0", + "mdit-py-plugins~=0.3.0", + "mdurl~=0.1.0", + "memray~=1.19.1", + "minify-html~=0.18.1", + "mistune~=3.1.2", + "ml-dtypes~=0.5.3", + "mlflow-skinny~=3.8.1", + "mmh3~=5.2.0", + "mosaicml-streaming~=0.13.0", + "mpmath~=1.3.0", + "msal~=1.34.0", + "msal-extensions~=1.3.1", + "msgpack~=1.1.2", + "multidict~=6.1.0", + "multimethod~=1.12", + "multiprocess~=0.70.16", + "murmurhash~=1.0.14", + "mypy-extensions~=1.0.0", + "namex~=0.1.0", + "nbclient~=0.10.2", + "nbconvert~=7.16.6", + "nbformat~=5.10.4", + "nest-asyncio~=1.6.0", + "networkx~=3.4.2", + "ninja~=1.13.0", + "nltk~=3.9.1", + "nodeenv~=1.9.1", + "notebook~=7.3.2", + "notebook-shim~=0.2.4", + "numba~=0.61.0", + "numpy~=2.1.3", + "oauthlib~=3.2.0", + "oci~=2.163.1", + "openai~=2.7.0", + "opencensus~=0.11.4", + "opencensus-context~=0.1.3", + "opentelemetry-api~=1.38.0", + "opentelemetry-proto~=1.38.0", + "opentelemetry-sdk~=1.38.0", + "opentelemetry-semantic-conventions~=0.59b0", + "opt-einsum~=3.4.0", + "optree~=0.17.0", + "optuna~=3.6.1", + "optuna-integration~=3.6.0", + "orjson~=3.11.4", + "ormsgpack~=1.12.0", + "overrides~=7.4.0", + "packaging~=24.2", + "pandas~=2.2.3", + "pandocfilters~=1.5.0", + "paramiko~=3.5.1", + "parso~=0.8.4", + "pathspec~=0.10.3", + "patsy~=1.0.1", + "pexpect~=4.8.0", + "phik~=0.12.5", + "pillow~=11.1.0", + "platformdirs~=4.3.7", + "plotly~=5.24.1", + "pluggy~=1.5.0", + "pooch~=1.8.2", + "preshed~=3.0.11", + "prometheus-client~=0.21.1", + "prompt-toolkit~=3.0.43", + "propcache~=0.3.1", + "prophet~=1.2.1", + "proto-plus~=1.26.1", + "protobuf~=5.29.4", + "psutil~=5.9.0", + "psycopg2~=2.9.11", + "ptyprocess~=0.7.0", + "pure-eval~=0.2.2", + "puremagic~=1.30", + "py-cpuinfo~=9.0.0", + "py-spy~=0.4.1", + "pyarrow~=21.0.0", + "pyasn1~=0.4.8", + "pyasn1-modules~=0.2.8", + "pyccolo~=0.0.71", + "pycparser~=2.21", + "pydantic~=2.10.6", + "pydantic-core~=2.27.2", + "pyflakes~=3.2.0", + "pygments~=2.19.1", + "pyiceberg~=0.10.0", + "pyjwt~=2.10.1", + "pynacl~=1.5.0", + "pyodbc~=5.2.0", + "pyopenssl~=25.0.0", + "pyparsing~=3.2.0", + "pyright~=1.1.394", + "pyroaring~=1.0.3", + "pytesseract~=0.3.10", + "pytest~=8.3.5", + "python-dateutil~=2.9.0.post0", + "python-dotenv~=1.2.1", + "python-editor~=1.0.4", + "python-json-logger~=3.2.1", + "python-lsp-jsonrpc~=1.1.2", + "python-lsp-server~=1.12.2", + "python-snappy~=0.7.3", + "pytoolconfig~=1.2.6", + "pytz~=2024.1", + "pywavelets~=1.8.0", + "pyyaml~=6.0.2", + "pyzmq~=26.2.0", + "ray~=2.37.0", + "referencing~=0.30.2", + "regex~=2024.11.6", + "requests~=2.32.3", + "requests-toolbelt~=1.0.0", + "rfc3339-validator~=0.1.4", + "rfc3986-validator~=0.1.1", + "rich~=13.9.4", + "rope~=1.13.0", + "rpds-py~=0.22.3", + "rsa~=4.9.1", + "s3transfer~=0.14.0", + "safetensors~=0.6.2", + "scikit-image~=0.25.0", + "scikit-learn~=1.6.1", + "scipy~=1.15.3", + "seaborn~=0.13.2", + "send2trash~=1.8.2", + "sentence-transformers~=5.1.2", + "sentencepiece~=0.2.1", + "setuptools~=78.1.1", + "shap~=0.49.1", + "shellingham~=1.5.4", + "six~=1.17.0", + "sklearn-compat~=0.1.3", + "slicer~=0.0.8", + "smart-open~=7.5.0", + "smmap~=5.0.0", + "sniffio~=1.3.0", + "sortedcontainers~=2.4.0", + "soundfile~=0.13.1", + "soupsieve~=2.5", + "soxr~=1.0.0", + "spacy~=3.7.5", + "spacy-legacy~=3.0.12", + "spacy-loggers~=1.0.5", + "sqlalchemy~=2.0.39", + "sqlparse~=0.5.3", + "srsly~=2.5.1", + "ssh-import-id~=5.11", + "stack-data~=0.6.3", + "stanio~=0.5.1", + "starlette~=0.49.3", + "statsmodels~=0.14.4", + "strictyaml~=1.7.3", + "sympy~=1.13.3", + "tenacity~=9.0.0", + "tensorboard~=2.20.0", + "tensorboard-data-server~=0.7.2", + "tensorboardx~=2.6.4", + "tensorflow~=2.20.0", + "termcolor~=3.2.0", + "terminado~=0.17.1", + "textual~=4.0.0", + "tf-keras~=2.20.1", + "thinc~=8.2.4", + "threadpoolctl~=3.5.0", + "tifffile~=2025.2.18", + "tiktoken~=0.9.0", + "tinycss2~=1.4.0", + "tokenize-rt~=6.1.0", + "tokenizers~=0.22.1", + "tomli~=2.0.1", + "torch~=2.9.0", + "torcheval~=0.0.7", + "torchvision~=0.24.0", + "tornado~=6.5.1", + "tqdm~=4.67.1", + "traitlets~=5.14.3", + "transformers~=4.57.1", + "typer~=0.20.0", + "typer-slim~=0.20.0", + "types-python-dateutil~=2.9.0.20251108", + "typing-extensions~=4.12.2", + "typing-inspect~=0.9.0", + "tzdata~=2024.1", + "uc-micro-py~=1.0.1", + "ujson~=5.10.0", + "uri-template~=1.3.0", + "urllib3~=2.3.0", + "uvicorn~=0.38.0", + "virtualenv~=20.29.3", + "visions~=0.8.1", + "wadllib~=1.3.6", + "wasabi~=1.1.3", + "wcwidth~=0.2.5", + "weasel~=0.4.3", + "webcolors~=25.10.0", + "webencodings~=0.5.1", + "websocket-client~=1.8.0", + "werkzeug~=3.1.3", + "whatthepatch~=1.0.2", + "wheel~=0.45.1", + "whenever~=0.7.3", + "widgetsnbextension~=3.6.6", + "wordcloud~=1.9.4", + "wrapt~=1.17.0", + "xgboost~=3.1.1", + "xgboost-ray~=0.1.19", + "xxhash~=3.5.0", + "yapf~=0.40.2", + "yarl~=1.18.0", + "ydata-profiling~=4.17.0", + "zipp~=3.21.0", + "zstandard~=0.23.0", + "zstd~=1.5.5.1", +] diff --git a/python/dbr/18.x-gpu-ml-scala2.13/constraints.txt b/python/dbr/18.x-gpu-ml-scala2.13/constraints.txt new file mode 100644 index 0000000..a31b41e --- /dev/null +++ b/python/dbr/18.x-gpu-ml-scala2.13/constraints.txt @@ -0,0 +1,398 @@ +# constraints.txt file for Databricks Runtime 18.x-gpu-ml-scala2.13 + +absl-py~=2.3.1 +accelerate~=1.11.0 +aiohappyeyeballs~=2.4.4 +aiohttp~=3.11.10 +aiohttp-cors~=0.8.1 +aiosignal~=1.2.0 +annotated-doc~=0.0.4 +annotated-types~=0.7.0 +anyio~=4.7.0 +argon2-cffi~=21.3.0 +argon2-cffi-bindings~=21.2.0 +arro3-core~=0.6.5 +arrow~=1.3.0 +asttokens~=3.0.0 +astunparse~=1.6.3 +async-lru~=2.0.4 +attrs~=24.3.0 +audioread~=3.1.0 +azure-common~=1.1.28 +azure-core~=1.36.0 +azure-cosmos~=4.3.1 +azure-identity~=1.20.0 +azure-mgmt-core~=1.6.0 +azure-mgmt-web~=8.0.0 +azure-storage-blob~=12.27.1 +azure-storage-file-datalake~=12.22.0 +babel~=2.16.0 +bcrypt~=4.3.0 +beautifulsoup4~=4.12.3 +black~=24.10.0 +bleach~=6.2.0 +blinker~=1.7.0 +blis~=0.7.11 +boto3~=1.40.45 +botocore~=1.40.45 +brotli~=1.2.0 +cachetools~=5.5.1 +catalogue~=2.0.10 +certifi~=2025.4.26 +cffi~=1.17.1 +chardet~=4.0.0 +charset-normalizer~=3.3.2 +circuitbreaker~=2.1.3 +click~=8.1.8 +cloudpathlib~=0.23.0 +cloudpickle~=3.0.0 +cmdstanpy~=1.3.0 +colorful~=0.5.8 +colorlog~=6.10.1 +comm~=0.2.1 +confection~=0.1.5 +contourpy~=1.3.1 +cramjam~=2.11.0 +cryptography~=44.0.1 +cycler~=0.11.0 +cymem~=2.0.12 +cython~=3.1.5 +dacite~=1.9.2 +databricks-agents~=1.9.1 +databricks-feature-engineering~=0.13.0.1 +databricks-sdk~=0.67 +dataclasses-json~=0.6.7 +datasets~=4.3.0 +dbl-tempo~=0.1.26 +debugpy~=1.8.11 +decorator~=5.1.1 +defusedxml~=0.7.1 +deltalake~=1.1.4 +deprecated~=1.2.18 +dill~=0.3.8 +distlib~=0.3.9 +distro~=1.9.0 +dm-tree~=0.1.9 +docstring-to-markdown~=0.11 +einops~=0.8.1 +evaluate~=0.4.6 +executing~=1.2.0 +facets-overview~=1.1.1 +farama-notifications~=0.0.4 +fastapi~=0.121.2 +fastjsonschema~=2.21.1 +filelock~=3.17.0 +filetype~=1.2.0 +flask~=2.2.5 +flatbuffers~=25.9.23 +fonttools~=4.55.3 +fqdn~=1.5.1 +frozenlist~=1.5.0 +fsspec~=2023.5.0 +gast~=0.6.0 +gitdb~=4.0.11 +gitpython~=3.1.43 +google-api-core~=2.28.1 +google-auth~=2.43.0 +google-cloud-core~=2.5.0 +google-cloud-storage~=3.2.0 +google-crc32c~=1.7.1 +google-pasta~=0.2.0 +google-resumable-media~=2.7.2 +googleapis-common-protos~=1.65.0 +graphql-core~=3.2.4 +greenlet~=3.1.1 +grpcio~=1.67 +grpcio-status~=1.67 +gymnasium~=0.28.1 +h11~=0.16.0 +h5py~=3.12.1 +hf-xet~=1.2.0 +hjson~=3.1.0 +holidays~=0.54 +httpcore~=1.0.9 +httplib2~=0.20.4 +httpx~=0.28.1 +huggingface-hub~=0.36.0 +idna~=3.7 +imagehash~=4.3.1 +imageio~=2.37.0 +imbalanced-learn~=0.13.0 +importlib-metadata~=8.5.0 +iniconfig~=1.1.1 +ipyflow-core~=0.0.209 +ipykernel~=6.29.5 +ipython~=8.30.0 +ipython-genutils~=0.2.0 +ipywidgets~=7.8.1 +isodate~=0.7.2 +isoduration~=20.11.0 +itsdangerous~=2.2.0 +jax-jumpy~=1.0.0 +jedi~=0.19.2 +jinja2~=3.1.6 +jiter~=0.12.0 +jmespath~=1.0.1 +joblib~=1.4.2 +joblibspark~=0.6.0 +json5~=0.9.25 +jsonpatch~=1.33 +jsonpointer~=3.0.0 +jsonschema~=4.23.0 +jsonschema-specifications~=2023.7.1 +jupyter~=1.1.1 +jupyter-client~=8.6.3 +jupyter-console~=6.6.3 +jupyter-core~=5.7.2 +jupyter-events~=0.12.0 +jupyter-lsp~=2.2.5 +jupyter-server~=2.15.0 +jupyter-server-terminals~=0.5.3 +jupyterlab~=4.3.4 +jupyterlab-pygments~=0.3.0 +jupyterlab-server~=2.27.3 +jupyterlab-widgets~=1.1.11 +keras~=3.12.0 +kiwisolver~=1.4.8 +langchain~=1.0.3 +langchain-core~=1.0.4 +langchain-openai~=1.0.2 +langcodes~=3.5.0 +langgraph~=1.0.3 +langgraph-checkpoint~=3.0.1 +langgraph-prebuilt~=1.0.4 +langgraph-sdk~=0.2.9 +langsmith~=0.4.41 +language-data~=1.3.0 +launchpadlib~=1.11.0 +lazr-restfulclient~=0.14.6 +lazr-uri~=1.0.6 +lazy-loader~=0.4 +libclang~=15.0.6.1 +librosa~=0.11.0 +lightgbm~=4.6.0 +linkify-it-py~=2.0.0 +litellm~=1.75.9 +llvmlite~=0.44.0 +lz4~=4.3.2 +mako~=1.3.10 +marisa-trie~=1.2.0 +markdown~=3.8 +markdown-it-py~=2.2.0 +markupsafe~=3.0.2 +marshmallow~=3.26.1 +matplotlib~=3.10.0 +matplotlib-inline~=0.1.7 +mccabe~=0.7.0 +mdit-py-plugins~=0.3.0 +mdurl~=0.1.0 +memray~=1.19.1 +minify-html~=0.18.1 +mistune~=3.1.2 +ml-dtypes~=0.5.3 +mlflow-skinny~=3.8.1 +mmh3~=5.2.0 +mosaicml-streaming~=0.13.0 +mpmath~=1.3.0 +msal~=1.34.0 +msal-extensions~=1.3.1 +msgpack~=1.1.2 +multidict~=6.1.0 +multimethod~=1.12 +multiprocess~=0.70.16 +murmurhash~=1.0.14 +mypy-extensions~=1.0.0 +namex~=0.1.0 +nbclient~=0.10.2 +nbconvert~=7.16.6 +nbformat~=5.10.4 +nest-asyncio~=1.6.0 +networkx~=3.4.2 +ninja~=1.13.0 +nltk~=3.9.1 +nodeenv~=1.9.1 +notebook~=7.3.2 +notebook-shim~=0.2.4 +numba~=0.61.0 +numpy~=2.1.3 +oauthlib~=3.2.0 +oci~=2.163.1 +openai~=2.7.0 +opencensus~=0.11.4 +opencensus-context~=0.1.3 +opentelemetry-api~=1.38.0 +opentelemetry-proto~=1.38.0 +opentelemetry-sdk~=1.38.0 +opentelemetry-semantic-conventions~=0.59b0 +opt-einsum~=3.4.0 +optree~=0.17.0 +optuna~=3.6.1 +optuna-integration~=3.6.0 +orjson~=3.11.4 +ormsgpack~=1.12.0 +overrides~=7.4.0 +packaging~=24.2 +pandas~=2.2.3 +pandocfilters~=1.5.0 +paramiko~=3.5.1 +parso~=0.8.4 +pathspec~=0.10.3 +patsy~=1.0.1 +pexpect~=4.8.0 +phik~=0.12.5 +pillow~=11.1.0 +platformdirs~=4.3.7 +plotly~=5.24.1 +pluggy~=1.5.0 +pooch~=1.8.2 +preshed~=3.0.11 +prometheus-client~=0.21.1 +prompt-toolkit~=3.0.43 +propcache~=0.3.1 +prophet~=1.2.1 +proto-plus~=1.26.1 +protobuf~=5.29.4 +psutil~=5.9.0 +psycopg2~=2.9.11 +ptyprocess~=0.7.0 +pure-eval~=0.2.2 +puremagic~=1.30 +py-cpuinfo~=9.0.0 +py-spy~=0.4.1 +pyarrow~=21.0.0 +pyasn1~=0.4.8 +pyasn1-modules~=0.2.8 +pyccolo~=0.0.71 +pycparser~=2.21 +pydantic~=2.10.6 +pydantic-core~=2.27.2 +pyflakes~=3.2.0 +pygments~=2.19.1 +pyiceberg~=0.10.0 +pyjwt~=2.10.1 +pynacl~=1.5.0 +pyodbc~=5.2.0 +pyopenssl~=25.0.0 +pyparsing~=3.2.0 +pyright~=1.1.394 +pyroaring~=1.0.3 +pytesseract~=0.3.10 +pytest~=8.3.5 +python-dateutil~=2.9.0.post0 +python-dotenv~=1.2.1 +python-editor~=1.0.4 +python-json-logger~=3.2.1 +python-lsp-jsonrpc~=1.1.2 +python-lsp-server~=1.12.2 +python-snappy~=0.7.3 +pytoolconfig~=1.2.6 +pytz~=2024.1 +pywavelets~=1.8.0 +pyyaml~=6.0.2 +pyzmq~=26.2.0 +ray~=2.37.0 +referencing~=0.30.2 +regex~=2024.11.6 +requests~=2.32.3 +requests-toolbelt~=1.0.0 +rfc3339-validator~=0.1.4 +rfc3986-validator~=0.1.1 +rich~=13.9.4 +rope~=1.13.0 +rpds-py~=0.22.3 +rsa~=4.9.1 +s3transfer~=0.14.0 +safetensors~=0.6.2 +scikit-image~=0.25.0 +scikit-learn~=1.6.1 +scipy~=1.15.3 +seaborn~=0.13.2 +send2trash~=1.8.2 +sentence-transformers~=5.1.2 +sentencepiece~=0.2.1 +setuptools~=78.1.1 +shap~=0.49.1 +shellingham~=1.5.4 +six~=1.17.0 +sklearn-compat~=0.1.3 +slicer~=0.0.8 +smart-open~=7.5.0 +smmap~=5.0.0 +sniffio~=1.3.0 +sortedcontainers~=2.4.0 +soundfile~=0.13.1 +soupsieve~=2.5 +soxr~=1.0.0 +spacy~=3.7.5 +spacy-legacy~=3.0.12 +spacy-loggers~=1.0.5 +sqlalchemy~=2.0.39 +sqlparse~=0.5.3 +srsly~=2.5.1 +ssh-import-id~=5.11 +stack-data~=0.6.3 +stanio~=0.5.1 +starlette~=0.49.3 +statsmodels~=0.14.4 +strictyaml~=1.7.3 +sympy~=1.13.3 +tenacity~=9.0.0 +tensorboard~=2.20.0 +tensorboard-data-server~=0.7.2 +tensorboardx~=2.6.4 +tensorflow~=2.20.0 +termcolor~=3.2.0 +terminado~=0.17.1 +textual~=4.0.0 +tf-keras~=2.20.1 +thinc~=8.2.4 +threadpoolctl~=3.5.0 +tifffile~=2025.2.18 +tiktoken~=0.9.0 +tinycss2~=1.4.0 +tokenize-rt~=6.1.0 +tokenizers~=0.22.1 +tomli~=2.0.1 +torch~=2.9.0 +torcheval~=0.0.7 +torchvision~=0.24.0 +tornado~=6.5.1 +tqdm~=4.67.1 +traitlets~=5.14.3 +transformers~=4.57.1 +typer~=0.20.0 +typer-slim~=0.20.0 +types-python-dateutil~=2.9.0.20251108 +typing-extensions~=4.12.2 +typing-inspect~=0.9.0 +tzdata~=2024.1 +uc-micro-py~=1.0.1 +ujson~=5.10.0 +uri-template~=1.3.0 +urllib3~=2.3.0 +uvicorn~=0.38.0 +virtualenv~=20.29.3 +visions~=0.8.1 +wadllib~=1.3.6 +wasabi~=1.1.3 +wcwidth~=0.2.5 +weasel~=0.4.3 +webcolors~=25.10.0 +webencodings~=0.5.1 +websocket-client~=1.8.0 +werkzeug~=3.1.3 +whatthepatch~=1.0.2 +wheel~=0.45.1 +whenever~=0.7.3 +widgetsnbextension~=3.6.6 +wordcloud~=1.9.4 +wrapt~=1.17.0 +xgboost~=3.1.1 +xgboost-ray~=0.1.19 +xxhash~=3.5.0 +yapf~=0.40.2 +yarl~=1.18.0 +ydata-profiling~=4.17.0 +zipp~=3.21.0 +zstandard~=0.23.0 +zstd~=1.5.5.1 diff --git a/python/dbr/18.x-gpu-ml-scala2.13/pyproject.toml b/python/dbr/18.x-gpu-ml-scala2.13/pyproject.toml new file mode 100644 index 0000000..30d6c75 --- /dev/null +++ b/python/dbr/18.x-gpu-ml-scala2.13/pyproject.toml @@ -0,0 +1,411 @@ +# pyproject.toml file for Databricks Runtime 18.x-gpu-ml-scala2.13 + +[project] +name = "constraint-env-18-x-gpu-ml-scala2-13" +version = "0.1.0" +requires-python = "==3.12.*" + +[dependency-groups] +dev = [ + "databricks-connect~=18.2.0", +] + +[tool.uv] +constraint-dependencies = [ + "absl-py~=2.3.1", + "accelerate~=1.11.0", + "aiohappyeyeballs~=2.4.4", + "aiohttp~=3.11.10", + "aiohttp-cors~=0.8.1", + "aiosignal~=1.2.0", + "annotated-doc~=0.0.4", + "annotated-types~=0.7.0", + "anyio~=4.7.0", + "argon2-cffi~=21.3.0", + "argon2-cffi-bindings~=21.2.0", + "arro3-core~=0.6.5", + "arrow~=1.3.0", + "asttokens~=3.0.0", + "astunparse~=1.6.3", + "async-lru~=2.0.4", + "attrs~=24.3.0", + "audioread~=3.1.0", + "azure-common~=1.1.28", + "azure-core~=1.36.0", + "azure-cosmos~=4.3.1", + "azure-identity~=1.20.0", + "azure-mgmt-core~=1.6.0", + "azure-mgmt-web~=8.0.0", + "azure-storage-blob~=12.27.1", + "azure-storage-file-datalake~=12.22.0", + "babel~=2.16.0", + "bcrypt~=4.3.0", + "beautifulsoup4~=4.12.3", + "black~=24.10.0", + "bleach~=6.2.0", + "blinker~=1.7.0", + "blis~=0.7.11", + "boto3~=1.40.45", + "botocore~=1.40.45", + "brotli~=1.2.0", + "cachetools~=5.5.1", + "catalogue~=2.0.10", + "certifi~=2025.4.26", + "cffi~=1.17.1", + "chardet~=4.0.0", + "charset-normalizer~=3.3.2", + "circuitbreaker~=2.1.3", + "click~=8.1.8", + "cloudpathlib~=0.23.0", + "cloudpickle~=3.0.0", + "cmdstanpy~=1.3.0", + "colorful~=0.5.8", + "colorlog~=6.10.1", + "comm~=0.2.1", + "confection~=0.1.5", + "contourpy~=1.3.1", + "cramjam~=2.11.0", + "cryptography~=44.0.1", + "cycler~=0.11.0", + "cymem~=2.0.12", + "cython~=3.1.5", + "dacite~=1.9.2", + "databricks-agents~=1.9.1", + "databricks-feature-engineering~=0.13.0.1", + "databricks-sdk~=0.67", + "dataclasses-json~=0.6.7", + "datasets~=4.3.0", + "dbl-tempo~=0.1.26", + "debugpy~=1.8.11", + "decorator~=5.1.1", + "defusedxml~=0.7.1", + "deltalake~=1.1.4", + "deprecated~=1.2.18", + "dill~=0.3.8", + "distlib~=0.3.9", + "distro~=1.9.0", + "dm-tree~=0.1.9", + "docstring-to-markdown~=0.11", + "einops~=0.8.1", + "evaluate~=0.4.6", + "executing~=1.2.0", + "facets-overview~=1.1.1", + "farama-notifications~=0.0.4", + "fastapi~=0.121.2", + "fastjsonschema~=2.21.1", + "filelock~=3.17.0", + "filetype~=1.2.0", + "flask~=2.2.5", + "flatbuffers~=25.9.23", + "fonttools~=4.55.3", + "fqdn~=1.5.1", + "frozenlist~=1.5.0", + "fsspec~=2023.5.0", + "gast~=0.6.0", + "gitdb~=4.0.11", + "gitpython~=3.1.43", + "google-api-core~=2.28.1", + "google-auth~=2.43.0", + "google-cloud-core~=2.5.0", + "google-cloud-storage~=3.2.0", + "google-crc32c~=1.7.1", + "google-pasta~=0.2.0", + "google-resumable-media~=2.7.2", + "googleapis-common-protos~=1.65.0", + "graphql-core~=3.2.4", + "greenlet~=3.1.1", + "grpcio~=1.67", + "grpcio-status~=1.67", + "gymnasium~=0.28.1", + "h11~=0.16.0", + "h5py~=3.12.1", + "hf-xet~=1.2.0", + "hjson~=3.1.0", + "holidays~=0.54", + "httpcore~=1.0.9", + "httplib2~=0.20.4", + "httpx~=0.28.1", + "huggingface-hub~=0.36.0", + "idna~=3.7", + "imagehash~=4.3.1", + "imageio~=2.37.0", + "imbalanced-learn~=0.13.0", + "importlib-metadata~=8.5.0", + "iniconfig~=1.1.1", + "ipyflow-core~=0.0.209", + "ipykernel~=6.29.5", + "ipython~=8.30.0", + "ipython-genutils~=0.2.0", + "ipywidgets~=7.8.1", + "isodate~=0.7.2", + "isoduration~=20.11.0", + "itsdangerous~=2.2.0", + "jax-jumpy~=1.0.0", + "jedi~=0.19.2", + "jinja2~=3.1.6", + "jiter~=0.12.0", + "jmespath~=1.0.1", + "joblib~=1.4.2", + "joblibspark~=0.6.0", + "json5~=0.9.25", + "jsonpatch~=1.33", + "jsonpointer~=3.0.0", + "jsonschema~=4.23.0", + "jsonschema-specifications~=2023.7.1", + "jupyter~=1.1.1", + "jupyter-client~=8.6.3", + "jupyter-console~=6.6.3", + "jupyter-core~=5.7.2", + "jupyter-events~=0.12.0", + "jupyter-lsp~=2.2.5", + "jupyter-server~=2.15.0", + "jupyter-server-terminals~=0.5.3", + "jupyterlab~=4.3.4", + "jupyterlab-pygments~=0.3.0", + "jupyterlab-server~=2.27.3", + "jupyterlab-widgets~=1.1.11", + "keras~=3.12.0", + "kiwisolver~=1.4.8", + "langchain~=1.0.3", + "langchain-core~=1.0.4", + "langchain-openai~=1.0.2", + "langcodes~=3.5.0", + "langgraph~=1.0.3", + "langgraph-checkpoint~=3.0.1", + "langgraph-prebuilt~=1.0.4", + "langgraph-sdk~=0.2.9", + "langsmith~=0.4.41", + "language-data~=1.3.0", + "launchpadlib~=1.11.0", + "lazr-restfulclient~=0.14.6", + "lazr-uri~=1.0.6", + "lazy-loader~=0.4", + "libclang~=15.0.6.1", + "librosa~=0.11.0", + "lightgbm~=4.6.0", + "linkify-it-py~=2.0.0", + "litellm~=1.75.9", + "llvmlite~=0.44.0", + "lz4~=4.3.2", + "mako~=1.3.10", + "marisa-trie~=1.2.0", + "markdown~=3.8", + "markdown-it-py~=2.2.0", + "markupsafe~=3.0.2", + "marshmallow~=3.26.1", + "matplotlib~=3.10.0", + "matplotlib-inline~=0.1.7", + "mccabe~=0.7.0", + "mdit-py-plugins~=0.3.0", + "mdurl~=0.1.0", + "memray~=1.19.1", + "minify-html~=0.18.1", + "mistune~=3.1.2", + "ml-dtypes~=0.5.3", + "mlflow-skinny~=3.8.1", + "mmh3~=5.2.0", + "mosaicml-streaming~=0.13.0", + "mpmath~=1.3.0", + "msal~=1.34.0", + "msal-extensions~=1.3.1", + "msgpack~=1.1.2", + "multidict~=6.1.0", + "multimethod~=1.12", + "multiprocess~=0.70.16", + "murmurhash~=1.0.14", + "mypy-extensions~=1.0.0", + "namex~=0.1.0", + "nbclient~=0.10.2", + "nbconvert~=7.16.6", + "nbformat~=5.10.4", + "nest-asyncio~=1.6.0", + "networkx~=3.4.2", + "ninja~=1.13.0", + "nltk~=3.9.1", + "nodeenv~=1.9.1", + "notebook~=7.3.2", + "notebook-shim~=0.2.4", + "numba~=0.61.0", + "numpy~=2.1.3", + "oauthlib~=3.2.0", + "oci~=2.163.1", + "openai~=2.7.0", + "opencensus~=0.11.4", + "opencensus-context~=0.1.3", + "opentelemetry-api~=1.38.0", + "opentelemetry-proto~=1.38.0", + "opentelemetry-sdk~=1.38.0", + "opentelemetry-semantic-conventions~=0.59b0", + "opt-einsum~=3.4.0", + "optree~=0.17.0", + "optuna~=3.6.1", + "optuna-integration~=3.6.0", + "orjson~=3.11.4", + "ormsgpack~=1.12.0", + "overrides~=7.4.0", + "packaging~=24.2", + "pandas~=2.2.3", + "pandocfilters~=1.5.0", + "paramiko~=3.5.1", + "parso~=0.8.4", + "pathspec~=0.10.3", + "patsy~=1.0.1", + "pexpect~=4.8.0", + "phik~=0.12.5", + "pillow~=11.1.0", + "platformdirs~=4.3.7", + "plotly~=5.24.1", + "pluggy~=1.5.0", + "pooch~=1.8.2", + "preshed~=3.0.11", + "prometheus-client~=0.21.1", + "prompt-toolkit~=3.0.43", + "propcache~=0.3.1", + "prophet~=1.2.1", + "proto-plus~=1.26.1", + "protobuf~=5.29.4", + "psutil~=5.9.0", + "psycopg2~=2.9.11", + "ptyprocess~=0.7.0", + "pure-eval~=0.2.2", + "puremagic~=1.30", + "py-cpuinfo~=9.0.0", + "py-spy~=0.4.1", + "pyarrow~=21.0.0", + "pyasn1~=0.4.8", + "pyasn1-modules~=0.2.8", + "pyccolo~=0.0.71", + "pycparser~=2.21", + "pydantic~=2.10.6", + "pydantic-core~=2.27.2", + "pyflakes~=3.2.0", + "pygments~=2.19.1", + "pyiceberg~=0.10.0", + "pyjwt~=2.10.1", + "pynacl~=1.5.0", + "pyodbc~=5.2.0", + "pyopenssl~=25.0.0", + "pyparsing~=3.2.0", + "pyright~=1.1.394", + "pyroaring~=1.0.3", + "pytesseract~=0.3.10", + "pytest~=8.3.5", + "python-dateutil~=2.9.0.post0", + "python-dotenv~=1.2.1", + "python-editor~=1.0.4", + "python-json-logger~=3.2.1", + "python-lsp-jsonrpc~=1.1.2", + "python-lsp-server~=1.12.2", + "python-snappy~=0.7.3", + "pytoolconfig~=1.2.6", + "pytz~=2024.1", + "pywavelets~=1.8.0", + "pyyaml~=6.0.2", + "pyzmq~=26.2.0", + "ray~=2.37.0", + "referencing~=0.30.2", + "regex~=2024.11.6", + "requests~=2.32.3", + "requests-toolbelt~=1.0.0", + "rfc3339-validator~=0.1.4", + "rfc3986-validator~=0.1.1", + "rich~=13.9.4", + "rope~=1.13.0", + "rpds-py~=0.22.3", + "rsa~=4.9.1", + "s3transfer~=0.14.0", + "safetensors~=0.6.2", + "scikit-image~=0.25.0", + "scikit-learn~=1.6.1", + "scipy~=1.15.3", + "seaborn~=0.13.2", + "send2trash~=1.8.2", + "sentence-transformers~=5.1.2", + "sentencepiece~=0.2.1", + "setuptools~=78.1.1", + "shap~=0.49.1", + "shellingham~=1.5.4", + "six~=1.17.0", + "sklearn-compat~=0.1.3", + "slicer~=0.0.8", + "smart-open~=7.5.0", + "smmap~=5.0.0", + "sniffio~=1.3.0", + "sortedcontainers~=2.4.0", + "soundfile~=0.13.1", + "soupsieve~=2.5", + "soxr~=1.0.0", + "spacy~=3.7.5", + "spacy-legacy~=3.0.12", + "spacy-loggers~=1.0.5", + "sqlalchemy~=2.0.39", + "sqlparse~=0.5.3", + "srsly~=2.5.1", + "ssh-import-id~=5.11", + "stack-data~=0.6.3", + "stanio~=0.5.1", + "starlette~=0.49.3", + "statsmodels~=0.14.4", + "strictyaml~=1.7.3", + "sympy~=1.13.3", + "tenacity~=9.0.0", + "tensorboard~=2.20.0", + "tensorboard-data-server~=0.7.2", + "tensorboardx~=2.6.4", + "tensorflow~=2.20.0", + "termcolor~=3.2.0", + "terminado~=0.17.1", + "textual~=4.0.0", + "tf-keras~=2.20.1", + "thinc~=8.2.4", + "threadpoolctl~=3.5.0", + "tifffile~=2025.2.18", + "tiktoken~=0.9.0", + "tinycss2~=1.4.0", + "tokenize-rt~=6.1.0", + "tokenizers~=0.22.1", + "tomli~=2.0.1", + "torch~=2.9.0", + "torcheval~=0.0.7", + "torchvision~=0.24.0", + "tornado~=6.5.1", + "tqdm~=4.67.1", + "traitlets~=5.14.3", + "transformers~=4.57.1", + "typer~=0.20.0", + "typer-slim~=0.20.0", + "types-python-dateutil~=2.9.0.20251108", + "typing-extensions~=4.12.2", + "typing-inspect~=0.9.0", + "tzdata~=2024.1", + "uc-micro-py~=1.0.1", + "ujson~=5.10.0", + "uri-template~=1.3.0", + "urllib3~=2.3.0", + "uvicorn~=0.38.0", + "virtualenv~=20.29.3", + "visions~=0.8.1", + "wadllib~=1.3.6", + "wasabi~=1.1.3", + "wcwidth~=0.2.5", + "weasel~=0.4.3", + "webcolors~=25.10.0", + "webencodings~=0.5.1", + "websocket-client~=1.8.0", + "werkzeug~=3.1.3", + "whatthepatch~=1.0.2", + "wheel~=0.45.1", + "whenever~=0.7.3", + "widgetsnbextension~=3.6.6", + "wordcloud~=1.9.4", + "wrapt~=1.17.0", + "xgboost~=3.1.1", + "xgboost-ray~=0.1.19", + "xxhash~=3.5.0", + "yapf~=0.40.2", + "yarl~=1.18.0", + "ydata-profiling~=4.17.0", + "zipp~=3.21.0", + "zstandard~=0.23.0", + "zstd~=1.5.5.1", +] diff --git a/python/dbr/18.x-scala2.13/constraints.txt b/python/dbr/18.x-scala2.13/constraints.txt new file mode 100644 index 0000000..3b85c0e --- /dev/null +++ b/python/dbr/18.x-scala2.13/constraints.txt @@ -0,0 +1,254 @@ +# constraints.txt file for Databricks Runtime 18.x-scala2.13 + +aiohappyeyeballs~=2.4.4 +aiohttp~=3.11.10 +aiosignal~=1.2.0 +annotated-doc~=0.0.4 +annotated-types~=0.7.0 +anyio~=4.7.0 +argon2-cffi~=21.3.0 +argon2-cffi-bindings~=21.2.0 +arro3-core~=0.6.5 +arrow~=1.3.0 +asttokens~=3.0.0 +astunparse~=1.6.3 +async-lru~=2.0.4 +attrs~=24.3.0 +azure-common~=1.1.28 +azure-core~=1.37.0 +azure-identity~=1.20.0 +azure-mgmt-core~=1.6.0 +azure-mgmt-web~=8.0.0 +azure-storage-blob~=12.28.0 +azure-storage-file-datalake~=12.22.0 +babel~=2.16.0 +beautifulsoup4~=4.12.3 +black~=24.10.0 +bleach~=6.2.0 +blinker~=1.7.0 +boto3~=1.40.45 +botocore~=1.40.45 +cachetools~=5.5.1 +certifi~=2025.4.26 +cffi~=1.17.1 +chardet~=4.0.0 +charset-normalizer~=3.3.2 +click~=8.1.8 +cloudpickle~=3.0.0 +comm~=0.2.1 +contourpy~=1.3.1 +cryptography~=44.0.1 +cycler~=0.11.0 +cython~=3.1.5 +databricks-agents~=1.9.1 +databricks-sdk~=0.67 +dataclasses-json~=0.6.7 +debugpy~=1.8.11 +decorator~=5.1.1 +defusedxml~=0.7.1 +deltalake~=1.1.4 +deprecated~=1.2.18 +distlib~=0.3.9 +docstring-to-markdown~=0.11 +executing~=1.2.0 +facets-overview~=1.1.1 +fastapi~=0.128.0 +fastjsonschema~=2.21.1 +filelock~=3.17.0 +fonttools~=4.55.3 +fqdn~=1.5.1 +frozenlist~=1.5.0 +fsspec~=2023.5.0 +gitdb~=4.0.11 +gitpython~=3.1.43 +google-api-core~=2.28.1 +google-auth~=2.47.0 +google-cloud-core~=2.5.0 +google-cloud-storage~=3.7.0 +google-crc32c~=1.8.0 +google-resumable-media~=2.8.0 +googleapis-common-protos~=1.65.0 +grpcio~=1.67 +grpcio-status~=1.67 +h11~=0.16.0 +hf-xet~=1.2.0 +httpcore~=1.0.9 +httplib2~=0.20.4 +httpx~=0.28.1 +huggingface-hub~=1.2.4 +idna~=3.7 +importlib-metadata~=8.5.0 +iniconfig~=1.1.1 +ipyflow-core~=0.0.209 +ipykernel~=6.29.5 +ipython~=8.30.0 +ipython-genutils~=0.2.0 +ipywidgets~=7.8.1 +isodate~=0.7.2 +isoduration~=20.11.0 +jedi~=0.19.2 +jinja2~=3.1.6 +jiter~=0.12.0 +jmespath~=1.0.1 +joblib~=1.4.2 +json5~=0.9.25 +jsonpatch~=1.33 +jsonpointer~=3.0.0 +jsonschema~=4.23.0 +jsonschema-specifications~=2023.7.1 +jupyter-client~=8.6.3 +jupyter-core~=5.7.2 +jupyter-events~=0.12.0 +jupyter-lsp~=2.2.5 +jupyter-server~=2.15.0 +jupyter-server-terminals~=0.5.3 +jupyterlab~=4.3.4 +jupyterlab-pygments~=0.3.0 +jupyterlab-server~=2.27.3 +jupyterlab-widgets~=1.1.11 +kiwisolver~=1.4.8 +langchain-core~=1.2.6 +langchain-openai~=1.1.6 +langsmith~=0.6.1 +launchpadlib~=1.11.0 +lazr-restfulclient~=0.14.6 +lazr-uri~=1.0.6 +litellm~=1.75.9 +markdown-it-py~=2.2.0 +markupsafe~=3.0.2 +marshmallow~=3.26.2 +matplotlib~=3.10.0 +matplotlib-inline~=0.1.7 +mccabe~=0.7.0 +mdurl~=0.1.0 +mistune~=3.1.2 +mlflow-skinny~=3.8.1 +mmh3~=5.2.0 +msal~=1.34.0 +msal-extensions~=1.3.1 +multidict~=6.1.0 +mypy-extensions~=1.0.0 +nbclient~=0.10.2 +nbconvert~=7.16.6 +nbformat~=5.10.4 +nest-asyncio~=1.6.0 +nodeenv~=1.10.0 +notebook~=7.3.2 +notebook-shim~=0.2.4 +numpy~=2.1.3 +oauthlib~=3.2.2 +openai~=2.14.0 +opentelemetry-api~=1.39.1 +opentelemetry-proto~=1.39.1 +opentelemetry-sdk~=1.39.1 +opentelemetry-semantic-conventions~=0.60b1 +orjson~=3.11.5 +overrides~=7.4.0 +packaging~=24.2 +pandas~=2.2.3 +pandocfilters~=1.5.0 +parso~=0.8.4 +pathspec~=0.10.3 +patsy~=1.0.1 +pexpect~=4.8.0 +pillow~=11.1.0 +platformdirs~=4.3.7 +plotly~=5.24.1 +pluggy~=1.5.0 +prometheus-client~=0.21.1 +prompt-toolkit~=3.0.43 +propcache~=0.3.1 +proto-plus~=1.27.0 +protobuf~=5.29.4 +psutil~=5.9.0 +psycopg2~=2.9.11 +ptyprocess~=0.7.0 +pure-eval~=0.2.2 +pyarrow~=21.0.0 +pyasn1~=0.4.8 +pyasn1-modules~=0.2.8 +pyccolo~=0.0.71 +pycparser~=2.21 +pydantic~=2.10.6 +pydantic-core~=2.27.2 +pyflakes~=3.2.0 +pygments~=2.19.1 +pyiceberg~=0.10.0 +pyjwt~=2.10.1 +pyodbc~=5.2.0 +pyparsing~=3.2.0 +pyright~=1.1.394 +pyroaring~=1.0.3 +pytest~=8.3.5 +python-dateutil~=2.9.0.post0 +python-dotenv~=1.2.1 +python-json-logger~=3.2.1 +python-lsp-jsonrpc~=1.1.2 +python-lsp-server~=1.12.2 +pytoolconfig~=1.2.6 +pytz~=2024.1 +pyyaml~=6.0.2 +pyzmq~=26.2.0 +referencing~=0.30.2 +regex~=2024.11.6 +requests~=2.32.3 +requests-toolbelt~=1.0.0 +rfc3339-validator~=0.1.4 +rfc3986-validator~=0.1.1 +rich~=13.9.4 +rope~=1.13.0 +rpds-py~=0.22.3 +rsa~=4.9.1 +s3transfer~=0.14.0 +scikit-learn~=1.6.1 +scipy~=1.15.3 +seaborn~=0.13.2 +send2trash~=1.8.2 +setuptools~=78.1.1 +shellingham~=1.5.4 +six~=1.17.0 +smmap~=5.0.0 +sniffio~=1.3.0 +sortedcontainers~=2.4.0 +soupsieve~=2.5 +sqlparse~=0.5.5 +ssh-import-id~=5.11 +stack-data~=0.6.3 +starlette~=0.50.0 +strictyaml~=1.7.3 +tenacity~=9.0.0 +terminado~=0.17.1 +threadpoolctl~=3.5.0 +tiktoken~=0.12.0 +tinycss2~=1.4.0 +tokenize-rt~=6.1.0 +tokenizers~=0.22.2 +tomli~=2.0.1 +tornado~=6.5.1 +tqdm~=4.67.1 +traitlets~=5.14.3 +typer-slim~=0.21.1 +types-python-dateutil~=2.9.0.20251115 +typing-extensions~=4.12.2 +typing-inspect~=0.9.0 +tzdata~=2024.1 +ujson~=5.10.0 +uri-template~=1.3.0 +urllib3~=2.3.0 +uuid-utils~=0.12.0 +uvicorn~=0.40.0 +virtualenv~=20.29.3 +wadllib~=1.3.6 +wcwidth~=0.2.5 +webcolors~=25.10.0 +webencodings~=0.5.1 +websocket-client~=1.8.0 +whatthepatch~=1.0.2 +wheel~=0.45.1 +whenever~=0.7.3 +widgetsnbextension~=3.6.6 +wrapt~=1.17.0 +yapf~=0.40.2 +yarl~=1.18.0 +zipp~=3.21.0 +zstandard~=0.23.0 diff --git a/python/dbr/18.x-scala2.13/pyproject.toml b/python/dbr/18.x-scala2.13/pyproject.toml new file mode 100644 index 0000000..9818485 --- /dev/null +++ b/python/dbr/18.x-scala2.13/pyproject.toml @@ -0,0 +1,267 @@ +# pyproject.toml file for Databricks Runtime 18.x-scala2.13 + +[project] +name = "constraint-env-18-x-scala2-13" +version = "0.1.0" +requires-python = "==3.12.*" + +[dependency-groups] +dev = [ + "databricks-connect~=18.2.0", +] + +[tool.uv] +constraint-dependencies = [ + "aiohappyeyeballs~=2.4.4", + "aiohttp~=3.11.10", + "aiosignal~=1.2.0", + "annotated-doc~=0.0.4", + "annotated-types~=0.7.0", + "anyio~=4.7.0", + "argon2-cffi~=21.3.0", + "argon2-cffi-bindings~=21.2.0", + "arro3-core~=0.6.5", + "arrow~=1.3.0", + "asttokens~=3.0.0", + "astunparse~=1.6.3", + "async-lru~=2.0.4", + "attrs~=24.3.0", + "azure-common~=1.1.28", + "azure-core~=1.37.0", + "azure-identity~=1.20.0", + "azure-mgmt-core~=1.6.0", + "azure-mgmt-web~=8.0.0", + "azure-storage-blob~=12.28.0", + "azure-storage-file-datalake~=12.22.0", + "babel~=2.16.0", + "beautifulsoup4~=4.12.3", + "black~=24.10.0", + "bleach~=6.2.0", + "blinker~=1.7.0", + "boto3~=1.40.45", + "botocore~=1.40.45", + "cachetools~=5.5.1", + "certifi~=2025.4.26", + "cffi~=1.17.1", + "chardet~=4.0.0", + "charset-normalizer~=3.3.2", + "click~=8.1.8", + "cloudpickle~=3.0.0", + "comm~=0.2.1", + "contourpy~=1.3.1", + "cryptography~=44.0.1", + "cycler~=0.11.0", + "cython~=3.1.5", + "databricks-agents~=1.9.1", + "databricks-sdk~=0.67", + "dataclasses-json~=0.6.7", + "debugpy~=1.8.11", + "decorator~=5.1.1", + "defusedxml~=0.7.1", + "deltalake~=1.1.4", + "deprecated~=1.2.18", + "distlib~=0.3.9", + "docstring-to-markdown~=0.11", + "executing~=1.2.0", + "facets-overview~=1.1.1", + "fastapi~=0.128.0", + "fastjsonschema~=2.21.1", + "filelock~=3.17.0", + "fonttools~=4.55.3", + "fqdn~=1.5.1", + "frozenlist~=1.5.0", + "fsspec~=2023.5.0", + "gitdb~=4.0.11", + "gitpython~=3.1.43", + "google-api-core~=2.28.1", + "google-auth~=2.47.0", + "google-cloud-core~=2.5.0", + "google-cloud-storage~=3.7.0", + "google-crc32c~=1.8.0", + "google-resumable-media~=2.8.0", + "googleapis-common-protos~=1.65.0", + "grpcio~=1.67", + "grpcio-status~=1.67", + "h11~=0.16.0", + "hf-xet~=1.2.0", + "httpcore~=1.0.9", + "httplib2~=0.20.4", + "httpx~=0.28.1", + "huggingface-hub~=1.2.4", + "idna~=3.7", + "importlib-metadata~=8.5.0", + "iniconfig~=1.1.1", + "ipyflow-core~=0.0.209", + "ipykernel~=6.29.5", + "ipython~=8.30.0", + "ipython-genutils~=0.2.0", + "ipywidgets~=7.8.1", + "isodate~=0.7.2", + "isoduration~=20.11.0", + "jedi~=0.19.2", + "jinja2~=3.1.6", + "jiter~=0.12.0", + "jmespath~=1.0.1", + "joblib~=1.4.2", + "json5~=0.9.25", + "jsonpatch~=1.33", + "jsonpointer~=3.0.0", + "jsonschema~=4.23.0", + "jsonschema-specifications~=2023.7.1", + "jupyter-client~=8.6.3", + "jupyter-core~=5.7.2", + "jupyter-events~=0.12.0", + "jupyter-lsp~=2.2.5", + "jupyter-server~=2.15.0", + "jupyter-server-terminals~=0.5.3", + "jupyterlab~=4.3.4", + "jupyterlab-pygments~=0.3.0", + "jupyterlab-server~=2.27.3", + "jupyterlab-widgets~=1.1.11", + "kiwisolver~=1.4.8", + "langchain-core~=1.2.6", + "langchain-openai~=1.1.6", + "langsmith~=0.6.1", + "launchpadlib~=1.11.0", + "lazr-restfulclient~=0.14.6", + "lazr-uri~=1.0.6", + "litellm~=1.75.9", + "markdown-it-py~=2.2.0", + "markupsafe~=3.0.2", + "marshmallow~=3.26.2", + "matplotlib~=3.10.0", + "matplotlib-inline~=0.1.7", + "mccabe~=0.7.0", + "mdurl~=0.1.0", + "mistune~=3.1.2", + "mlflow-skinny~=3.8.1", + "mmh3~=5.2.0", + "msal~=1.34.0", + "msal-extensions~=1.3.1", + "multidict~=6.1.0", + "mypy-extensions~=1.0.0", + "nbclient~=0.10.2", + "nbconvert~=7.16.6", + "nbformat~=5.10.4", + "nest-asyncio~=1.6.0", + "nodeenv~=1.10.0", + "notebook~=7.3.2", + "notebook-shim~=0.2.4", + "numpy~=2.1.3", + "oauthlib~=3.2.2", + "openai~=2.14.0", + "opentelemetry-api~=1.39.1", + "opentelemetry-proto~=1.39.1", + "opentelemetry-sdk~=1.39.1", + "opentelemetry-semantic-conventions~=0.60b1", + "orjson~=3.11.5", + "overrides~=7.4.0", + "packaging~=24.2", + "pandas~=2.2.3", + "pandocfilters~=1.5.0", + "parso~=0.8.4", + "pathspec~=0.10.3", + "patsy~=1.0.1", + "pexpect~=4.8.0", + "pillow~=11.1.0", + "platformdirs~=4.3.7", + "plotly~=5.24.1", + "pluggy~=1.5.0", + "prometheus-client~=0.21.1", + "prompt-toolkit~=3.0.43", + "propcache~=0.3.1", + "proto-plus~=1.27.0", + "protobuf~=5.29.4", + "psutil~=5.9.0", + "psycopg2~=2.9.11", + "ptyprocess~=0.7.0", + "pure-eval~=0.2.2", + "pyarrow~=21.0.0", + "pyasn1~=0.4.8", + "pyasn1-modules~=0.2.8", + "pyccolo~=0.0.71", + "pycparser~=2.21", + "pydantic~=2.10.6", + "pydantic-core~=2.27.2", + "pyflakes~=3.2.0", + "pygments~=2.19.1", + "pyiceberg~=0.10.0", + "pyjwt~=2.10.1", + "pyodbc~=5.2.0", + "pyparsing~=3.2.0", + "pyright~=1.1.394", + "pyroaring~=1.0.3", + "pytest~=8.3.5", + "python-dateutil~=2.9.0.post0", + "python-dotenv~=1.2.1", + "python-json-logger~=3.2.1", + "python-lsp-jsonrpc~=1.1.2", + "python-lsp-server~=1.12.2", + "pytoolconfig~=1.2.6", + "pytz~=2024.1", + "pyyaml~=6.0.2", + "pyzmq~=26.2.0", + "referencing~=0.30.2", + "regex~=2024.11.6", + "requests~=2.32.3", + "requests-toolbelt~=1.0.0", + "rfc3339-validator~=0.1.4", + "rfc3986-validator~=0.1.1", + "rich~=13.9.4", + "rope~=1.13.0", + "rpds-py~=0.22.3", + "rsa~=4.9.1", + "s3transfer~=0.14.0", + "scikit-learn~=1.6.1", + "scipy~=1.15.3", + "seaborn~=0.13.2", + "send2trash~=1.8.2", + "setuptools~=78.1.1", + "shellingham~=1.5.4", + "six~=1.17.0", + "smmap~=5.0.0", + "sniffio~=1.3.0", + "sortedcontainers~=2.4.0", + "soupsieve~=2.5", + "sqlparse~=0.5.5", + "ssh-import-id~=5.11", + "stack-data~=0.6.3", + "starlette~=0.50.0", + "strictyaml~=1.7.3", + "tenacity~=9.0.0", + "terminado~=0.17.1", + "threadpoolctl~=3.5.0", + "tiktoken~=0.12.0", + "tinycss2~=1.4.0", + "tokenize-rt~=6.1.0", + "tokenizers~=0.22.2", + "tomli~=2.0.1", + "tornado~=6.5.1", + "tqdm~=4.67.1", + "traitlets~=5.14.3", + "typer-slim~=0.21.1", + "types-python-dateutil~=2.9.0.20251115", + "typing-extensions~=4.12.2", + "typing-inspect~=0.9.0", + "tzdata~=2024.1", + "ujson~=5.10.0", + "uri-template~=1.3.0", + "urllib3~=2.3.0", + "uuid-utils~=0.12.0", + "uvicorn~=0.40.0", + "virtualenv~=20.29.3", + "wadllib~=1.3.6", + "wcwidth~=0.2.5", + "webcolors~=25.10.0", + "webencodings~=0.5.1", + "websocket-client~=1.8.0", + "whatthepatch~=1.0.2", + "wheel~=0.45.1", + "whenever~=0.7.3", + "widgetsnbextension~=3.6.6", + "wrapt~=1.17.0", + "yapf~=0.40.2", + "yarl~=1.18.0", + "zipp~=3.21.0", + "zstandard~=0.23.0", +]