Skip to content

Commit

Permalink
Added automated upgrade capacity
Browse files Browse the repository at this point in the history
  • Loading branch information
nfx committed Feb 23, 2024
1 parent 9cbc6f8 commit 20dafd4
Show file tree
Hide file tree
Showing 10 changed files with 108 additions and 8 deletions.
Empty file.
9 changes: 9 additions & 0 deletions src/databricks/labs/blueprint/migrations/v0.0.1_add_user.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import logging

from databricks.sdk import WorkspaceClient

logger = logging.getLogger(__name__)


def upgrade(ws: WorkspaceClient):
logger.info(f"upgrading user: {ws.current_user.me().user_name}")
9 changes: 9 additions & 0 deletions src/databricks/labs/blueprint/migrations/v0.0.1_other.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import logging

from databricks.sdk import WorkspaceClient

logger = logging.getLogger(__name__)


def upgrade(ws: WorkspaceClient):
logger.info(f"other for: {ws.current_user.me().user_name}")
9 changes: 9 additions & 0 deletions src/databricks/labs/blueprint/migrations/v0.1.3_other.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import logging

from databricks.sdk import WorkspaceClient

logger = logging.getLogger(__name__)


def upgrade(ws: WorkspaceClient):
logger.info(f"something else: {ws.current_user.me().user_name}")
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import logging

from databricks.sdk import WorkspaceClient

logger = logging.getLogger(__name__)


def upgrade(ws: WorkspaceClient):
logger.info(f"breaking change: {ws.current_user.me().user_name}")
30 changes: 30 additions & 0 deletions src/databricks/labs/blueprint/upgrades.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
from databricks.sdk.mixins.compute import SemVer

from databricks.labs.blueprint.installation import Installation
from databricks.labs.blueprint.wheels import Version


class Upgrades:
def __init__(self, installation: Installation):
self._installation = installation

def apply(self):
pass

def _installed(self) -> SemVer:
return self._installation.load(Version).as_semver()

def _diff(self, names: list[str]):
installed_version = self._installed()
for name in names:
semver = self._parse_version(name)
if not semver < installed_version:
continue
yield name

@staticmethod
def _parse_version(name: str) -> SemVer:
split = name.split("_")
if len(split) < 1:
raise ValueError(f"invalid spec: {name}")
return SemVer.parse(split[0])
28 changes: 20 additions & 8 deletions src/databricks/labs/blueprint/wheels.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from databricks.sdk import WorkspaceClient
from databricks.sdk.mixins.compute import SemVer

from databricks.labs.blueprint.entrypoint import find_project_root
from databricks.labs.blueprint.entrypoint import find_project_root, find_dir_with_leaf
from databricks.labs.blueprint.installation import Installation
from databricks.labs.blueprint.installer import InstallState

Expand Down Expand Up @@ -40,7 +40,7 @@ def __init__(
version_file_name: str = "__about__.py",
github_org: str = "databrickslabs",
):
self._project_root = find_project_root(__file)
self.__file = __file
self._version_file_name = version_file_name
self._github_org = github_org

Expand All @@ -49,9 +49,16 @@ def from_class(cls, klass: type, *, version_file_name: str = "__about__.py") ->
file = inspect.getfile(klass)
return cls(file, version_file_name=version_file_name)

def _local_project_root(self):
return find_project_root(self.__file)

@property
def _project_root(self):
return self._local_project_root()

def project_root(self):
# TODO: introduce the "in wheel detection", using the __about__.py as marker
return self._project_root
return self._local_project_root()

def version(self):
"""Returns current version of the project"""
Expand All @@ -65,16 +72,17 @@ def version(self):
return self.__version

def product_name(self) -> str:
version_file = self.version_file_in(self._project_root)
version_file = self._find_version_file_in_sub_folders(self._project_root)
version_file_folder = version_file.parent
return version_file_folder.name.replace("_", "-")

def released_version(self) -> str:
version_file = self.version_file_in(self._project_root)
find_dir_with_leaf()
version_file = self._find_version_file_in_sub_folders(self._project_root)
return self._read_version(version_file)

def is_git_checkout(self) -> bool:
git_config = self._project_root / ".git" / "config"
git_config = self._local_project_root() / ".git" / "config"
return git_config.exists()

def is_unreleased_version(self) -> bool:
Expand Down Expand Up @@ -107,11 +115,12 @@ def _semver_and_pep440(git_detached_version: str) -> str:
SemVer.parse(semver_and_pep0440)
return semver_and_pep0440

def version_file_in(self, root: Path) -> Path:
def _find_version_file_in_sub_folders(self, root: Path) -> Path:
names = [self._version_file_name]
queue: list[Path] = [root]
while queue:
current = queue.pop(0)
# iterate sub folders until we find __about__.py
for file in current.iterdir():
if file.name in names:
return file
Expand Down Expand Up @@ -139,6 +148,9 @@ class Version:
wheel: str
date: str

def as_semver(self) -> SemVer:
return SemVer.parse(self.version)


class WheelsV2(AbstractContextManager):
"""Wheel builder"""
Expand Down Expand Up @@ -202,7 +214,7 @@ def _build_wheel(self, tmp_dir: str, *, verbose: bool = False):
return next(Path(tmp_dir).glob("*.whl"))

def _override_version_to_unreleased(self, tmp_dir_path: Path):
version_file = self._product_info.version_file_in(tmp_dir_path)
version_file = self._product_info._find_version_file_in_sub_folders(tmp_dir_path)
with version_file.open("w") as f:
f.write(f'__version__ = "{self._product_info.version()}"')

Expand Down
2 changes: 2 additions & 0 deletions tests/integration/test_upgrades.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
def test_upgrades_works():
pass
12 changes: 12 additions & 0 deletions tests/unit/test_upgrades.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from databricks.labs.blueprint.installation import MockInstallation
from databricks.labs.blueprint.upgrades import Upgrades


def test_upgrades_works():
installation = MockInstallation({
'version.json': {
'version': '0.0.1'
}
})
upgrades = Upgrades(installation)
# upgrades.
8 changes: 8 additions & 0 deletions tests/unit/test_wheels.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import re

import pytest
from databricks.sdk.service.compute import Language

from databricks.labs.blueprint.__about__ import __version__
from databricks.labs.blueprint.entrypoint import is_in_debug
Expand Down Expand Up @@ -51,3 +52,10 @@ def test_released_version(tmp_path):
assert __version__ == product_info.version()
assert not product_info.is_unreleased_version()
assert not product_info.is_git_checkout()


def test_locator():
from databricks.sdk.version import __version__
sdk_info = ProductInfo.from_class(Language, version_file_name='version.py')
released_version = sdk_info.released_version()
assert __version__ == released_version

0 comments on commit 20dafd4

Please sign in to comment.