Skip to content

Commit aaac2de

Browse files
authored
Make gempy an optional dependency (#6)
# Make GemPy an optional dependency Replaces direct imports of GemPy with a dynamic import through `optional_dependencies.require_gempy()`. This allows gempy-viewer to function without requiring GemPy to be installed by default. Key changes: - Added a `require_gempy()` function in optional_dependencies.py - Changed direct imports to use string type annotations or dynamic imports - Removed GemPy from base requirements.txt and added it to dev-requirements.txt - Removed unused AR plotting function - Changed version handling to use local _version instead of importing from GemPy This improves modularity by making GemPy an optional dependency that's only loaded when needed, simplifying dependency management for users who don't need the full GemPy functionality.
2 parents d02809f + 4cc349b commit aaac2de

File tree

7 files changed

+16
-44
lines changed

7 files changed

+16
-44
lines changed

gempy_viewer/API/_plot_LiquidEarth.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
from typing import Optional
22

3-
import gempy
43
from gempy_viewer.optional_dependencies import require_liquid_earth_sdk
54

65

76
def plot_to_liquid_earth(
8-
geo_model: gempy.data.GeoModel, space_name: str,
7+
geo_model: "gempy.data.GeoModel", space_name: str,
98
file_name: str = "gempy_model", user_token: Optional[str] = None, grab_link=True,
109
make_new_space: bool = False
1110
):

gempy_viewer/DEP/_plot.py

Lines changed: 3 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@
2727
# sys.path.append( path.dirname( path.dirname( path.abspath(__file__) ) ) )
2828

2929
from typing import Set, Tuple, Dict, Union
30-
import gempy as _gempy
30+
31+
from gempy_viewer import optional_dependencies
3132
from gempy_viewer.DEP._visualization_2d import PlotData2D, PlotSolution
3233
from gempy_viewer.DEP.visualization_3d import GemPyvtkInteract
3334

@@ -99,6 +100,7 @@ def export_to_vtk(geo_data, path=None, name=None, voxels=True, block=None, surfa
99100
path=path)
100101
if surfaces is True:
101102
geo_data.solutions.compute_all_surfaces()
103+
_gempy = optional_dependencies.require_gempy()
102104
ver, sim = _gempy.get_surfaces(geo_data)
103105
GemPyvtkInteract.export_vtk_surfaces(geo_data, ver, sim, path=path,
104106
name=name)
@@ -387,39 +389,3 @@ def plot_topology(
387389
edge_kwargs=edge_kwargs
388390
)
389391

390-
391-
def plot_ar(geo_model, path=None, project_name=None, api_token=None, secret=None):
392-
""" Create, upload and retrieve tag to visualize the model in AR in rexview
393-
394-
https://www.rexos.org/getting-started/
395-
396-
Args:
397-
geo_model (gempy.Model):
398-
path: Location for rex files. Default cwd
399-
project_name: Name of the project in rexos
400-
api_token: rexos api token
401-
secret: rexos secret
402-
403-
Returns:
404-
gempy.addons.rex_api.Rextag
405-
"""
406-
from gempy.addons.rex_api import upload_to_rexcloud
407-
from gempy.addons.gempy_to_rexfile import write_rex, geomodel_to_rex
408-
if project_name is None:
409-
project_name = geo_model.meta.project_name
410-
411-
if path is None:
412-
path = '/'
413-
414-
rex_bytes = geomodel_to_rex(geo_model)
415-
files_path = write_rex(rex_bytes, path)
416-
project_name_ = project_name
417-
for i in range(40):
418-
try:
419-
tag = upload_to_rexcloud(files_path, project_name=project_name_, api_token=api_token, secret=secret)
420-
break
421-
except ConnectionError:
422-
project_name_ = project_name + str(i)
423-
pass
424-
425-
return tag

gempy_viewer/DEP/visualization_3d.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@
3030
import pandas as pn
3131
import numpy as np
3232
import sys
33-
import gempy as gp
3433
import warnings
3534

35+
from gempy_viewer import optional_dependencies
3636

3737
warnings.filterwarnings("ignore",
3838
message='.*Conversion of the second argument of issubdtype *.',
@@ -1116,6 +1116,7 @@ def update_surfaces_real_time(self, delete=True):
11161116
if delete is True:
11171117
self.delete_surfaces()
11181118
try:
1119+
gp = optional_dependencies.require_gempy()
11191120
gp.compute_model(self.geo_model, sort_surfaces=False, compute_mesh=True)
11201121
except IndexError:
11211122
print('IndexError: Model not computed. Laking data in some surface')

gempy_viewer/__init__.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,12 @@
22

33
from gempy_viewer.modules.plot_3d.vista import GemPyToVista
44
from .API import *
5-
import gempy
65
__all__ = ['plot_2d', 'plot_3d', 'plot_section_traces', 'plot_topology', 'plot_stereonet']
76

87

98
# Assert at least pyton 3.10
109
assert sys.version_info[0] >= 3 and sys.version_info[1] >= 10, "GemPy requires Python 3.10 or higher"
11-
__version__ = gempy.__version__
10+
from ._version import __version__
1211

1312
if __name__ == '__main__':
1413
pass

gempy_viewer/optional_dependencies.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,13 @@ def require_gempy_plugins():
1212
raise ImportError("The gempy.plugins package is required to run this function.")
1313
return gempy.plugins
1414

15+
def require_gempy():
16+
try:
17+
import gempy
18+
except ImportError:
19+
raise ImportError("The gempy package is required to run this function.")
20+
return gempy
21+
1522

1623
def require_pyvista():
1724
try:

requirements/dev-requirements.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
-r optional_requirements.txt
22

3-
pytest
3+
pytest
4+
gempy

requirements/requirements.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
1-
gempy~=2024.2.0
21
matplotlib
32
numpy

0 commit comments

Comments
 (0)