Skip to content

Commit

Permalink
refactor(imports): add function to import optional packages
Browse files Browse the repository at this point in the history
matplotlib is now a FloPy requirement.

Closes modflowpy#1257
  • Loading branch information
jdhughes-usgs committed Oct 12, 2021
1 parent 99e6dac commit 5113cfd
Show file tree
Hide file tree
Showing 10 changed files with 54 additions and 29 deletions.
17 changes: 11 additions & 6 deletions flopy/export/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -1511,8 +1511,10 @@ def export_array(
a = a.copy()
a[np.isnan(a)] = nodata
if modelgrid.angrot != 0:
extra = "exporting rotated grids requires SciPy."
ndimage = import_optional_dependency("scipy.ndimage", extra=extra)
ndimage = import_optional_dependency(
"scipy.ndimage",
error_message="exporting rotated grids requires SciPy.",
)

a = ndimage.rotate(a, modelgrid.angrot, cval=nodata)
height_rot, width_rot = a.shape
Expand Down Expand Up @@ -1548,8 +1550,10 @@ def export_array(
or modelgrid.delr[0] != modelgrid.delc[0]
):
raise ValueError("GeoTIFF export require a uniform grid.")
extra = "GeoTIFF export requires the rasterio."
rasterio = import_optional_dependency("rasterio", extra=extra)
rasterio = import_optional_dependency(
"rasterio",
error_message="GeoTIFF export requires the rasterio.",
)
dxdy = modelgrid.delc[0]
# because this is only implemented for a structured grid,
# we can get the xul and yul coordinate from modelgrid.xvertices(0, 0)
Expand Down Expand Up @@ -1709,8 +1713,9 @@ def export_contourf(
"""

extra = "export_contourf requires shapely."
shapely = import_optional_dependency("shapely", extra=extra)
shapely = import_optional_dependency(
"shapely", error_message="export_contourf requires shapely."
)
from shapely import geometry

from ..utils.geometry import Polygon
Expand Down
6 changes: 4 additions & 2 deletions flopy/mf6/utils/binaryfile_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -229,8 +229,10 @@ def _get_vertices(mfdict, key):
elevations corresponding to a row column location
"""

extra = "MFOutputRequester._get_vertices() requires pandas."
pd = import_optional_dependency("pandas", extra=extra)
pd = import_optional_dependency(
"pandas",
error_message="MFOutputRequester._get_vertices() requires pandas.",
)

mname = key[0]
cellid = mfdict[(mname, "DISV8", "CELL2D", "cell2d_num")]
Expand Down
6 changes: 4 additions & 2 deletions flopy/mf6/utils/mfobservation.py
Original file line number Diff line number Diff line change
Expand Up @@ -209,8 +209,10 @@ def get_dataframe(
pd.DataFrame
"""
extra = "get_dataframe() requires pandas."
pd = import_optional_dependency("pandas", extra=extra)
pd = import_optional_dependency(
"pandas",
error_message="get_dataframe() requires pandas.",
)

data_str = self._reader(self.Obsname)
data = self._array_to_dict(data_str)
Expand Down
6 changes: 4 additions & 2 deletions flopy/utils/mflistfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -475,8 +475,10 @@ def get_dataframes(self, start_datetime="1-1-1970", diff=False):
"""

extra = "ListBudget.get_dataframes() requires pandas."
pd = import_optional_dependency("pandas", extra=extra)
pd = import_optional_dependency(
"pandas",
error_message="ListBudget.get_dataframes() requires pandas.",
)

if not self._isvalid:
return None
Expand Down
12 changes: 8 additions & 4 deletions flopy/utils/mtlistfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,10 @@ def parse(
(optionally) surface-water mass budget.
If the SFT process is not used, df_sw is None.
"""
extra = "MtListBudget.parse() requires pandas."
pd = import_optional_dependency("pandas", extra=extra)
pd = import_optional_dependency(
"pandas",
error_message="MtListBudget.parse() requires pandas.",
)

self.gw_data = {}
self.sw_data = {}
Expand Down Expand Up @@ -183,8 +185,10 @@ def parse(
return df_gw, df_sw

def _diff(self, df):
extra = "MtListBudget._diff() requires pandas."
pd = import_optional_dependency("pandas", extra=extra)
pd = import_optional_dependency(
"pandas",
error_message="MtListBudget._diff() requires pandas.",
)

out_cols = [
c for c in df.columns if "_out" in c and not c.startswith("net_")
Expand Down
6 changes: 4 additions & 2 deletions flopy/utils/observationfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -177,8 +177,10 @@ def get_dataframe(

from ..utils.utils_def import totim_to_datetime

extra = "ObsFiles.get_dataframe() requires pandas."
pd = import_optional_dependency("pandas", extra=extra)
pd = import_optional_dependency(
"pandas",
error_message="ObsFiles.get_dataframe() requires pandas.",
)

i0 = 0
i1 = self.data.shape[0]
Expand Down
6 changes: 4 additions & 2 deletions flopy/utils/util_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -442,8 +442,10 @@ def get_dataframe(self, squeeze=False):
Requires pandas.
"""
extra = "MfList.get_dataframe() requires pandas."
pd = import_optional_dependency("pandas", extra=extra)
pd = import_optional_dependency(
"pandas",
error_message="MfList.get_dataframe() requires pandas.",
)

# make a dataframe of all data for all stress periods
names = ["per", "k", "i", "j"]
Expand Down
6 changes: 3 additions & 3 deletions flopy/utils/utl_import.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ def get_version(module: types.ModuleType) -> str:

def import_optional_dependency(
name: str,
extra: str = "",
error_message: str = "",
errors: str = "raise",
min_version: str | None = None,
):
Expand All @@ -89,7 +89,7 @@ def import_optional_dependency(
----------
name : str
The module name.
extra : str
error_message : str
Additional text to include in the ImportError message.
errors : str {'raise', 'warn', 'ignore'}
What to do when a dependency is not found or its version is too old.
Expand Down Expand Up @@ -121,7 +121,7 @@ def import_optional_dependency(
install_name = package_name if package_name is not None else name

msg = (
f"Missing optional dependency '{install_name}'. {extra} "
f"Missing optional dependency '{install_name}'. {error_message} "
f"Use pip or conda to install {install_name}."
)
try:
Expand Down
6 changes: 4 additions & 2 deletions flopy/utils/voronoi.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,10 @@ def tri2vor(tri, **kwargs):
verts, iverts : ndarray, list of lists
"""
extra = "Voronoi requires SciPy."
import_optional_dependency("scipy.spatial", extra=extra)
import_optional_dependency(
"scipy.spatial",
error_message="Voronoi requires SciPy.",
)
from scipy.spatial import Voronoi

# assign local variables
Expand Down
12 changes: 8 additions & 4 deletions flopy/utils/zonbud.py
Original file line number Diff line number Diff line change
Expand Up @@ -2369,8 +2369,10 @@ def _recarray_to_dataframe(
pd.DataFrame
"""
extra = "ZoneBudget.get_dataframes() requires pandas."
pd = import_optional_dependency("pandas", extra=extra)
pd = import_optional_dependency(
"pandas",
error_message="ZoneBudget.get_dataframes() requires pandas.",
)

valid_index_keys = ["totim", "kstpkper"]
s = f'index_key "{index_key}" is not valid.'
Expand Down Expand Up @@ -2991,8 +2993,10 @@ def _volumetric_flux(recarray, modeltime, extrapolate_kper=False):
pd.DataFrame
"""
extra = "ZoneBudget._volumetric_flux() requires pandas."
pd = import_optional_dependency("pandas", extra=extra)
pd = import_optional_dependency(
"pandas",
error_message="ZoneBudget._volumetric_flux() requires pandas.",
)

nper = len(modeltime.nstp)
volumetric_data = {}
Expand Down

0 comments on commit 5113cfd

Please sign in to comment.