Skip to content
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

feat: removed pkg_resources from all test files and moved importlib into pandas extra #1726

Merged
merged 22 commits into from
Nov 28, 2023
Merged
Show file tree
Hide file tree
Changes from 21 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
f5d3299
feat: Introduce compatibility with native namespace packages
parthea Nov 14, 2023
06d7a9a
Update copyright year
parthea Nov 14, 2023
34196e1
removed pkg_resources from all test files and moved importlib into pa…
kiraksi Nov 16, 2023
8d5396a
feat: removed pkg_resources from all test files and moved importlib i…
kiraksi Nov 16, 2023
e905cbe
Adding no cover tag to test code
kiraksi Nov 16, 2023
43e89a6
reformatted with black
kiraksi Nov 16, 2023
bdbcdc9
undo revert
kiraksi Nov 20, 2023
86a97f7
perf: use the first page a results when `query(api_method="QUERY")` (…
tswast Nov 21, 2023
326f052
fix: ensure query job retry has longer deadline than API request dead…
tswast Nov 21, 2023
cbcde2f
fix: `load_table_from_dataframe` now assumes there may be local null …
tswast Nov 22, 2023
2a99358
chore: standardize samples directory - delete unneeded dependencies (…
kiraksi Nov 22, 2023
893704a
fix: move grpc, proto-plus and protobuf packages to extras (#1721)
kiraksi Nov 22, 2023
9331a7e
remove unnecessary version checks
kiraksi Nov 27, 2023
5c82dcf
undo bad commit, remove unneeded version checks
kiraksi Nov 27, 2023
f90e390
Revert "undo bad commit, remove unneeded version checks"
kiraksi Nov 27, 2023
47a95fb
Revert "remove unnecessary version checks"
kiraksi Nov 27, 2023
e8eea53
revert bad changes, remove pkg_resources from file
kiraksi Nov 27, 2023
95dbd07
after clarification, reimplement changes and ignore 3.12 tests
kiraksi Nov 27, 2023
fb9ea00
reformatted with black
kiraksi Nov 27, 2023
34259a7
Merge branch 'main' into remove-pkgresources
kiraksi Nov 27, 2023
90fd53b
removed minimum check
kiraksi Nov 27, 2023
c50eca3
updated pandas installed version check
kiraksi Nov 28, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions .coveragerc
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,3 @@ exclude_lines =
pragma: NO COVER
# Ignore debug-only repr
def __repr__
# Ignore pkg_resources exceptions.
# This is added at the module level as a safeguard for if someone
# generates the code and tries to run it without pip installing. This
# makes it virtually impossible to test properly.
except pkg_resources.DistributionNotFound
24 changes: 0 additions & 24 deletions google/__init__.py

This file was deleted.

24 changes: 0 additions & 24 deletions google/cloud/__init__.py

This file was deleted.

5 changes: 3 additions & 2 deletions noxfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ def mypy(session):
"types-requests",
"types-setuptools",
)
session.run("mypy", "google/cloud", "--show-traceback")
session.run("mypy", "-p", "google", "--show-traceback")


@nox.session(python=DEFAULT_PYTHON_VERSION)
Expand All @@ -149,7 +149,8 @@ def pytype(session):
session.install("attrs==20.3.0")
session.install("-e", ".[all]")
session.install(PYTYPE_VERSION)
session.run("pytype")
# See https://github.com/google/pytype/issues/464
session.run("pytype", "-P", ".", "google/cloud/bigquery")


@nox.session(python=SYSTEM_TEST_PYTHON_VERSIONS)
Expand Down
10 changes: 2 additions & 8 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@
"pandas>=1.1.0",
pyarrow_dependency,
"db-dtypes>=0.3.0,<2.0.0dev",
"importlib_metadata>=1.0.0; python_version<'3.8'",
],
"ipywidgets": [
"ipywidgets>=7.7.0",
Expand Down Expand Up @@ -108,16 +109,10 @@
# benchmarks, etc.
packages = [
package
for package in setuptools.PEP420PackageFinder.find()
for package in setuptools.find_namespace_packages()
if package.startswith("google")
]

# Determine which namespaces are needed.
namespaces = ["google"]
if "google.cloud" in packages:
namespaces.append("google.cloud")


setuptools.setup(
name=name,
version=version,
Expand All @@ -143,7 +138,6 @@
],
platforms="Posix; MacOS X; Windows",
packages=packages,
namespace_packages=namespaces,
install_requires=dependencies,
extras_require=extras,
python_requires=">=3.7",
Expand Down
23 changes: 10 additions & 13 deletions tests/system/test_pandas.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,13 @@
import warnings

import google.api_core.retry
import pkg_resources
import pytest

try:
import importlib.metadata as metadata
except ImportError:
import importlib_metadata as metadata

from google.cloud import bigquery

from google.cloud.bigquery import enums
Expand All @@ -42,11 +46,9 @@
)

if pandas is not None:
PANDAS_INSTALLED_VERSION = pkg_resources.get_distribution("pandas").parsed_version
PANDAS_INSTALLED_VERSION = metadata.version("pandas")
else:
PANDAS_INSTALLED_VERSION = pkg_resources.parse_version("0.0.0")

PANDAS_INT64_VERSION = pkg_resources.parse_version("1.0.0")
PANDAS_INSTALLED_VERSION = "0.0.0"


class MissingDataError(Exception):
Expand Down Expand Up @@ -310,10 +312,7 @@ def test_load_table_from_dataframe_w_automatic_schema(bigquery_client, dataset_i
]


@pytest.mark.skipif(
PANDAS_INSTALLED_VERSION < PANDAS_INT64_VERSION,
reason="Only `pandas version >=1.0.0` is supported",
)
@pytest.mark.skipif(pandas is None, reason="Requires `pandas`")
def test_load_table_from_dataframe_w_nullable_int64_datatype(
bigquery_client, dataset_id
):
Expand Down Expand Up @@ -342,7 +341,7 @@ def test_load_table_from_dataframe_w_nullable_int64_datatype(


@pytest.mark.skipif(
PANDAS_INSTALLED_VERSION < PANDAS_INT64_VERSION,
PANDAS_INSTALLED_VERSION[0:2] in ["0."],
kiraksi marked this conversation as resolved.
Show resolved Hide resolved
reason="Only `pandas version >=1.0.0` is supported",
)
def test_load_table_from_dataframe_w_nullable_int64_datatype_automatic_schema(
Expand Down Expand Up @@ -1043,9 +1042,7 @@ def test_list_rows_max_results_w_bqstorage(bigquery_client):
assert len(dataframe.index) == 100


@pytest.mark.skipif(
PANDAS_INSTALLED_VERSION >= pkg_resources.parse_version("2.0.0"), reason=""
)
@pytest.mark.skipif(PANDAS_INSTALLED_VERSION[0:2] not in ["0.", "1."], reason="")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This has several elements in the list so it is a bit easier to grok what is happening here.

@pytest.mark.parametrize(
("max_results",),
(
Expand Down
14 changes: 8 additions & 6 deletions tests/unit/job/test_query_pandas.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
import json

import mock
import pkg_resources
import pytest


Expand Down Expand Up @@ -45,14 +44,19 @@
except (ImportError, AttributeError): # pragma: NO COVER
tqdm = None

try:
import importlib.metadata as metadata
except ImportError:
import importlib_metadata as metadata

from ..helpers import make_connection
from .helpers import _make_client
from .helpers import _make_job_resource

if pandas is not None:
PANDAS_INSTALLED_VERSION = pkg_resources.get_distribution("pandas").parsed_version
PANDAS_INSTALLED_VERSION = metadata.version("pandas")
else:
PANDAS_INSTALLED_VERSION = pkg_resources.parse_version("0.0.0")
PANDAS_INSTALLED_VERSION = "0.0.0"

pandas = pytest.importorskip("pandas")

Expand Down Expand Up @@ -656,9 +660,7 @@ def test_to_dataframe_bqstorage_no_pyarrow_compression():
)


@pytest.mark.skipif(
PANDAS_INSTALLED_VERSION >= pkg_resources.parse_version("2.0.0"), reason=""
)
@pytest.mark.skipif(PANDAS_INSTALLED_VERSION[0:2] not in ["0.", "1."], reason="")
@pytest.mark.skipif(pyarrow is None, reason="Requires `pyarrow`")
def test_to_dataframe_column_dtypes():
from google.cloud.bigquery.job import QueryJob as target_class
Expand Down
32 changes: 10 additions & 22 deletions tests/unit/test__pandas_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,11 @@
import operator
import queue
import warnings
import pkg_resources

try:
import importlib.metadata as metadata
except ImportError:
import importlib_metadata as metadata

import mock

Expand Down Expand Up @@ -57,13 +61,10 @@

bigquery_storage = _versions_helpers.BQ_STORAGE_VERSIONS.try_import()

PANDAS_MINIUM_VERSION = pkg_resources.parse_version("1.0.0")

if pandas is not None:
PANDAS_INSTALLED_VERSION = pkg_resources.get_distribution("pandas").parsed_version
PANDAS_INSTALLED_VERSION = metadata.version("pandas")
else:
# Set to less than MIN version.
PANDAS_INSTALLED_VERSION = pkg_resources.parse_version("0.0.0")
PANDAS_INSTALLED_VERSION = "0.0.0"


skip_if_no_bignumeric = pytest.mark.skipif(
Expand Down Expand Up @@ -542,9 +543,7 @@ def test_bq_to_arrow_array_w_nullable_scalars(module_under_test, bq_type, rows):
],
)
@pytest.mark.skipif(pandas is None, reason="Requires `pandas`")
@pytest.mark.skipif(
PANDAS_INSTALLED_VERSION >= pkg_resources.parse_version("2.0.0"), reason=""
)
@pytest.mark.skipif(PANDAS_INSTALLED_VERSION[0:2] not in ["0.", "1."], reason="")
@pytest.mark.skipif(isinstance(pyarrow, mock.Mock), reason="Requires `pyarrow`")
def test_bq_to_arrow_array_w_pandas_timestamp(module_under_test, bq_type, rows):
rows = [pandas.Timestamp(row) for row in rows]
Expand Down Expand Up @@ -806,10 +805,7 @@ def test_list_columns_and_indexes_with_named_index_same_as_column_name(
assert columns_and_indexes == expected


@pytest.mark.skipif(
pandas is None or PANDAS_INSTALLED_VERSION < PANDAS_MINIUM_VERSION,
reason="Requires `pandas version >= 1.0.0` which introduces pandas.NA",
)
@pytest.mark.skipif(pandas is None, reason="Requires `pandas`")
def test_dataframe_to_json_generator(module_under_test):
utcnow = datetime.datetime.utcnow()
df_data = collections.OrderedDict(
Expand Down Expand Up @@ -837,16 +833,8 @@ def test_dataframe_to_json_generator(module_under_test):
assert list(rows) == expected


@pytest.mark.skipif(pandas is None, reason="Requires `pandas`")
def test_dataframe_to_json_generator_repeated_field(module_under_test):
pytest.importorskip(
"pandas",
minversion=str(PANDAS_MINIUM_VERSION),
reason=(
f"Requires `pandas version >= {PANDAS_MINIUM_VERSION}` "
"which introduces pandas.NA"
),
)

df_data = [
collections.OrderedDict(
[("repeated_col", [pandas.NA, 2, None, 4]), ("not_repeated_col", "first")]
Expand Down
23 changes: 9 additions & 14 deletions tests/unit/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,11 @@
import requests
import packaging
import pytest
import pkg_resources

try:
import importlib.metadata as metadata
except ImportError:
import importlib_metadata as metadata

try:
import pandas
Expand Down Expand Up @@ -76,13 +80,10 @@
from test_utils.imports import maybe_fail_import
from tests.unit.helpers import make_connection

PANDAS_MINIUM_VERSION = pkg_resources.parse_version("1.0.0")

if pandas is not None:
PANDAS_INSTALLED_VERSION = pkg_resources.get_distribution("pandas").parsed_version
PANDAS_INSTALLED_VERSION = metadata.version("pandas")
else:
# Set to less than MIN version.
PANDAS_INSTALLED_VERSION = pkg_resources.parse_version("0.0.0")
PANDAS_INSTALLED_VERSION = "0.0.0"


def _make_credentials():
Expand Down Expand Up @@ -8145,10 +8146,7 @@ def test_load_table_from_dataframe_unknown_table(self):
timeout=DEFAULT_TIMEOUT,
)

@unittest.skipIf(
pandas is None or PANDAS_INSTALLED_VERSION < PANDAS_MINIUM_VERSION,
"Only `pandas version >=1.0.0` supported",
)
@unittest.skipIf(pandas is None, "Requires `pandas`")
@unittest.skipIf(pyarrow is None, "Requires `pyarrow`")
def test_load_table_from_dataframe_w_nullable_int64_datatype(self):
from google.cloud.bigquery.client import _DEFAULT_NUM_RETRIES
Expand Down Expand Up @@ -8193,10 +8191,7 @@ def test_load_table_from_dataframe_w_nullable_int64_datatype(self):
SchemaField("x", "INT64", "NULLABLE", None),
)

@unittest.skipIf(
pandas is None or PANDAS_INSTALLED_VERSION < PANDAS_MINIUM_VERSION,
"Only `pandas version >=1.0.0` supported",
)
@unittest.skipIf(pandas is None, "Requires `pandas`")
# @unittest.skipIf(pyarrow is None, "Requires `pyarrow`")
def test_load_table_from_dataframe_w_nullable_int64_datatype_automatic_schema(self):
from google.cloud.bigquery.client import _DEFAULT_NUM_RETRIES
Expand Down
37 changes: 37 additions & 0 deletions tests/unit/test_packaging.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# Copyright 2023 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import os
import subprocess
import sys


def test_namespace_package_compat(tmp_path):
# The ``google`` namespace package should not be masked
# by the presence of ``google-cloud-bigquery``.
google = tmp_path / "google"
google.mkdir()
google.joinpath("othermod.py").write_text("")
env = dict(os.environ, PYTHONPATH=str(tmp_path))
cmd = [sys.executable, "-m", "google.othermod"]
subprocess.check_call(cmd, env=env)

# The ``google.cloud`` namespace package should not be masked
# by the presence of ``google-cloud-bigquery``.
google_cloud = tmp_path / "google" / "cloud"
google_cloud.mkdir()
google_cloud.joinpath("othermod.py").write_text("")
env = dict(os.environ, PYTHONPATH=str(tmp_path))
cmd = [sys.executable, "-m", "google.cloud.othermod"]
subprocess.check_call(cmd, env=env)
Loading