Skip to content

feat: warn when the BigFrames version is more than a year old #1455

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
Mar 12, 2025
4 changes: 4 additions & 0 deletions bigframes/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,10 @@ class BadIndexerKeyWarning(Warning):
"""The indexer key is not used correctly."""


class ObsoleteVersionWarning(Warning):
"""The BigFrames version is too old."""


class ColorFormatter:
WARNING = "\033[93m"
ENDC = "\033[0m"
Expand Down
16 changes: 13 additions & 3 deletions bigframes/session/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

from __future__ import annotations

import datetime
import logging
import os
import secrets
Expand Down Expand Up @@ -54,6 +55,8 @@
)
import pyarrow as pa

from bigframes import exceptions as bfe
from bigframes import version
import bigframes._config.bigquery_options as bigquery_options
import bigframes.clients
import bigframes.core.blocks as blocks
Expand All @@ -65,8 +68,6 @@
# to register new and replacement ops with the Ibis BigQuery backend.
import bigframes.dataframe
import bigframes.dtypes
import bigframes.exceptions
import bigframes.exceptions as bfe
import bigframes.functions._function_session as bff_session
import bigframes.functions.function as bff
import bigframes.session._io.bigquery as bf_io_bigquery
Expand All @@ -77,7 +78,6 @@
import bigframes.session.planner
import bigframes.session.temp_storage
import bigframes.session.validation
import bigframes.version

# Avoid circular imports.
if typing.TYPE_CHECKING:
Expand Down Expand Up @@ -147,6 +147,8 @@ def __init__(
context: Optional[bigquery_options.BigQueryOptions] = None,
clients_provider: Optional[bigframes.session.clients.ClientsProvider] = None,
):
_warn_if_bf_version_is_obsolete()

if context is None:
context = bigquery_options.BigQueryOptions()

Expand Down Expand Up @@ -1813,3 +1815,11 @@ def read_gbq_object_table(

def connect(context: Optional[bigquery_options.BigQueryOptions] = None) -> Session:
return Session(context)


def _warn_if_bf_version_is_obsolete():
today = datetime.datetime.today()
release_date = datetime.datetime.strptime(version.__release_date__, "%Y-%m-%d")
if today - release_date > datetime.timedelta(days=365):
msg = f"Your BigFrames version {version.__version__} is more than 1 year old. Please update to the lastest version."
warnings.warn(msg, bfe.ObsoleteVersionWarning)
19 changes: 17 additions & 2 deletions tests/unit/session/test_session.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@
import pytest

import bigframes
from bigframes import version
import bigframes.enums
import bigframes.exceptions

from .. import resources
from tests.unit import resources

TABLE_REFERENCE = {
"projectId": "my-project",
Expand Down Expand Up @@ -443,3 +443,18 @@ def test_session_init_fails_with_no_project():
credentials=mock.Mock(spec=google.auth.credentials.Credentials)
)
)


def test_session_init_warns_if_bf_version_is_too_old(monkeypatch):
release_date = datetime.datetime.strptime(version.__release_date__, "%Y-%m-%d")
current_date = release_date + datetime.timedelta(days=366)

class FakeDatetime(datetime.datetime):
@classmethod
def today(cls):
return current_date

monkeypatch.setattr(datetime, "datetime", FakeDatetime)

with pytest.warns(bigframes.exceptions.ObsoleteVersionWarning):
resources.create_bigquery_session()